]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/c-family/c-common.h
[Patch][Aarch64] Refactor comments in aarch64_print_operand
[thirdparty/gcc.git] / gcc / c-family / c-common.h
CommitLineData
7f4edbcb 1/* Definitions for c-common.c.
cbe34bb5 2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
7f4edbcb 3
1322177d 4This file is part of GCC.
7f4edbcb 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.
7f4edbcb 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.
7f4edbcb
BS
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/>. */
7f4edbcb 19
0e5921e8
ZW
20#ifndef GCC_C_COMMON_H
21#define GCC_C_COMMON_H
22
8f17b5c5 23#include "splay-tree.h"
2a967f3d 24#include "cpplib.h"
40e23961 25#include "alias.h"
532aafad 26#include "tree.h"
40e23961 27#include "fold-const.h"
8f17b5c5 28
59cc9210
SB
29/* In order for the format checking to accept the C frontend
30 diagnostic framework extensions, you must include this file before
718f9c0f 31 diagnostic-core.h, not after. The C front end formats are a subset of those
59cc9210
SB
32 for C++, so they are the appropriate set to use in common code;
33 cp-tree.h overrides this for C++. */
718f9c0f
MLI
34#if defined(GCC_DIAGNOSTIC_CORE_H)
35#error \
36In order for the format checking to accept the C front end diagnostic \
37framework extensions, you must include this file before diagnostic-core.h \
38never after.
39#endif
59cc9210
SB
40#ifndef GCC_DIAG_STYLE
41#define GCC_DIAG_STYLE __gcc_cdiag__
42#endif
43#include "diagnostic-core.h"
44
f2c5f623 45/* Usage of TREE_LANG_FLAG_?:
3af07c22 46 0: IDENTIFIER_MARKED (used by search routines).
928c19bb 47 C_MAYBE_CONST_EXPR_INT_OPERANDS (in C_MAYBE_CONST_EXPR, for C)
f2c5f623 48 1: C_DECLARED_LABEL_FLAG (in LABEL_DECL)
325c3691 49 STATEMENT_LIST_STMT_EXPR (in STATEMENT_LIST)
928c19bb 50 C_MAYBE_CONST_EXPR_NON_CONST (in C_MAYBE_CONST_EXPR, for C)
6de9cd9a 51 2: unused
174283a3 52 3: STATEMENT_LIST_HAS_LABEL (in STATEMENT_LIST)
325c3691 53 4: unused
f2c5f623
BC
54*/
55
0e5921e8 56/* Reserved identifiers. This is the union of all the keywords for C,
40f03658 57 C++, and Objective-C. All the type modifiers have to be in one
0e5921e8 58 block at the beginning, because they are used as mask bits. There
bbceee64 59 are 28 type modifiers; if we add many more we will have to redesign
0e5921e8 60 the mask mechanism. */
f09f1de5
MM
61
62enum rid
63{
0e5921e8 64 /* Modifiers: */
2ba84f36 65 /* C, in empirical order of frequency. */
0e5921e8
ZW
66 RID_STATIC = 0,
67 RID_UNSIGNED, RID_LONG, RID_CONST, RID_EXTERN,
68 RID_REGISTER, RID_TYPEDEF, RID_SHORT, RID_INLINE,
69 RID_VOLATILE, RID_SIGNED, RID_AUTO, RID_RESTRICT,
267bac10 70 RID_NORETURN, RID_ATOMIC,
0e5921e8
ZW
71
72 /* C extensions */
ab22c1fa 73 RID_COMPLEX, RID_THREAD, RID_SAT,
0e5921e8
ZW
74
75 /* C++ */
76 RID_FRIEND, RID_VIRTUAL, RID_EXPLICIT, RID_EXPORT, RID_MUTABLE,
77
1973201f
NP
78 /* ObjC ("PQ" reserved words - they do not appear after a '@' and
79 are keywords only in specific contexts) */
b8363a24 80 RID_IN, RID_OUT, RID_INOUT, RID_BYCOPY, RID_BYREF, RID_ONEWAY,
0e5921e8 81
668ea4b1
IS
82 /* ObjC ("PATTR" reserved words - they do not appear after a '@'
83 and are keywords only as property attributes) */
200290f2
NP
84 RID_GETTER, RID_SETTER,
85 RID_READONLY, RID_READWRITE,
86 RID_ASSIGN, RID_RETAIN, RID_COPY,
200290f2 87 RID_NONATOMIC,
668ea4b1 88
fa5da7de
JM
89 /* C (reserved and imaginary types not implemented, so any use is a
90 syntax error) */
91 RID_IMAGINARY,
92
0e5921e8
ZW
93 /* C */
94 RID_INT, RID_CHAR, RID_FLOAT, RID_DOUBLE, RID_VOID,
95 RID_ENUM, RID_STRUCT, RID_UNION, RID_IF, RID_ELSE,
96 RID_WHILE, RID_DO, RID_FOR, RID_SWITCH, RID_CASE,
97 RID_DEFAULT, RID_BREAK, RID_CONTINUE, RID_RETURN, RID_GOTO,
98 RID_SIZEOF,
99
100 /* C extensions */
101 RID_ASM, RID_TYPEOF, RID_ALIGNOF, RID_ATTRIBUTE, RID_VA_ARG,
da5b307a 102 RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL, RID_CHOOSE_EXPR,
f90e8e2e 103 RID_TYPES_COMPATIBLE_P, RID_BUILTIN_COMPLEX, RID_BUILTIN_SHUFFLE,
9a8ce21f 104 RID_DFLOAT32, RID_DFLOAT64, RID_DFLOAT128,
c65699ef
JM
105
106 /* TS 18661-3 keywords, in the same sequence as the TI_* values. */
107 RID_FLOAT16,
108 RID_FLOATN_NX_FIRST = RID_FLOAT16,
109 RID_FLOAT32,
110 RID_FLOAT64,
111 RID_FLOAT128,
112 RID_FLOAT32X,
113 RID_FLOAT64X,
114 RID_FLOAT128X,
115#define CASE_RID_FLOATN_NX \
116 case RID_FLOAT16: case RID_FLOAT32: case RID_FLOAT64: case RID_FLOAT128: \
117 case RID_FLOAT32X: case RID_FLOAT64X: case RID_FLOAT128X
118
74893f25 119 RID_FRACT, RID_ACCUM, RID_AUTO_TYPE, RID_BUILTIN_CALL_WITH_STATIC_CHAIN,
0e5921e8 120
1ee62b92
PG
121 /* "__GIMPLE", for the GIMPLE-parsing extension to the C frontend. */
122 RID_GIMPLE,
123
124 /* "__PHI", for parsing PHI function in GIMPLE FE. */
125 RID_PHI,
126
c2e84327
DM
127 /* "__RTL", for the RTL-parsing extension to the C frontend. */
128 RID_RTL,
129
48b0b196 130 /* C11 */
433cc7b0 131 RID_ALIGNAS, RID_GENERIC,
d19fa6b5 132
eea1139b
ILT
133 /* This means to warn that this is a C++ keyword, and then treat it
134 as a normal identifier. */
135 RID_CXX_COMPAT_WARN,
136
0a35513e
AH
137 /* GNU transactional memory extension */
138 RID_TRANSACTION_ATOMIC, RID_TRANSACTION_RELAXED, RID_TRANSACTION_CANCEL,
139
0ba8a114
NS
140 /* Too many ways of getting the name of a function as a string */
141 RID_FUNCTION_NAME, RID_PRETTY_FUNCTION_NAME, RID_C99_FUNCTION_NAME,
142
1973201f
NP
143 /* C++ (some of these are keywords in Objective-C as well, but only
144 if they appear after a '@') */
0e5921e8
ZW
145 RID_BOOL, RID_WCHAR, RID_CLASS,
146 RID_PUBLIC, RID_PRIVATE, RID_PROTECTED,
147 RID_TEMPLATE, RID_NULL, RID_CATCH,
148 RID_DELETE, RID_FALSE, RID_NAMESPACE,
c22cacf3
MS
149 RID_NEW, RID_OFFSETOF, RID_OPERATOR,
150 RID_THIS, RID_THROW, RID_TRUE,
151 RID_TRY, RID_TYPENAME, RID_TYPEID,
b6baa67d 152 RID_USING, RID_CHAR16, RID_CHAR32,
0e5921e8
ZW
153
154 /* casts */
155 RID_CONSTCAST, RID_DYNCAST, RID_REINTCAST, RID_STATCAST,
156
cb68ec50 157 /* C++ extensions */
e16f1cc7
JJ
158 RID_ADDRESSOF, RID_BASES,
159 RID_BUILTIN_LAUNDER, RID_DIRECT_BASES,
cb68ec50
PC
160 RID_HAS_NOTHROW_ASSIGN, RID_HAS_NOTHROW_CONSTRUCTOR,
161 RID_HAS_NOTHROW_COPY, RID_HAS_TRIVIAL_ASSIGN,
162 RID_HAS_TRIVIAL_CONSTRUCTOR, RID_HAS_TRIVIAL_COPY,
342cfb3e
JJ
163 RID_HAS_TRIVIAL_DESTRUCTOR, RID_HAS_UNIQUE_OBJ_REPRESENTATIONS,
164 RID_HAS_VIRTUAL_DESTRUCTOR,
af88f557
JJ
165 RID_IS_ABSTRACT, RID_IS_AGGREGATE,
166 RID_IS_BASE_OF, RID_IS_CLASS,
cb68ec50 167 RID_IS_EMPTY, RID_IS_ENUM,
b3908fcc
JW
168 RID_IS_FINAL, RID_IS_LITERAL_TYPE,
169 RID_IS_POD, RID_IS_POLYMORPHIC,
971e17ff 170 RID_IS_SAME_AS,
b3908fcc 171 RID_IS_STD_LAYOUT, RID_IS_TRIVIAL,
dd5d5481 172 RID_IS_TRIVIALLY_ASSIGNABLE, RID_IS_TRIVIALLY_CONSTRUCTIBLE,
b752325e 173 RID_IS_TRIVIALLY_COPYABLE,
b3908fcc 174 RID_IS_UNION, RID_UNDERLYING_TYPE,
b42cc3ca 175 RID_IS_ASSIGNABLE, RID_IS_CONSTRUCTIBLE,
cb68ec50 176
b3908fcc 177 /* C++11 */
0a766368 178 RID_CONSTEXPR, RID_DECLTYPE, RID_NOEXCEPT, RID_NULLPTR, RID_STATIC_ASSERT,
218f0015 179
971e17ff
AS
180 /* C++ concepts */
181 RID_CONCEPT, RID_REQUIRES,
182
b8fd7909
JM
183 /* C++ transactional memory. */
184 RID_ATOMIC_NOEXCEPT, RID_ATOMIC_CANCEL, RID_SYNCHRONIZED,
185
939b37da 186 /* Cilk Plus keywords. */
9a771876 187 RID_CILK_SPAWN, RID_CILK_SYNC, RID_CILK_FOR,
939b37da 188
1973201f
NP
189 /* Objective-C ("AT" reserved words - they are only keywords when
190 they follow '@') */
3a3589b4 191 RID_AT_ENCODE, RID_AT_END,
0e5921e8 192 RID_AT_CLASS, RID_AT_ALIAS, RID_AT_DEFS,
c37d8c30 193 RID_AT_PRIVATE, RID_AT_PROTECTED, RID_AT_PUBLIC, RID_AT_PACKAGE,
c22cacf3 194 RID_AT_PROTOCOL, RID_AT_SELECTOR,
264fa2db 195 RID_AT_THROW, RID_AT_TRY, RID_AT_CATCH,
92902b1b 196 RID_AT_FINALLY, RID_AT_SYNCHRONIZED,
668ea4b1 197 RID_AT_OPTIONAL, RID_AT_REQUIRED, RID_AT_PROPERTY,
da57d1b9 198 RID_AT_SYNTHESIZE, RID_AT_DYNAMIC,
264fa2db 199 RID_AT_INTERFACE,
0e5921e8
ZW
200 RID_AT_IMPLEMENTATION,
201
36c5e70a
BE
202 /* Named address support, mapping the keyword to a particular named address
203 number. Named address space 0 is reserved for the generic address. If
204 there are more than 254 named addresses, the addr_space_t type will need
205 to be grown from an unsigned char to unsigned short. */
206 RID_ADDR_SPACE_0, /* generic address */
207 RID_ADDR_SPACE_1,
208 RID_ADDR_SPACE_2,
209 RID_ADDR_SPACE_3,
210 RID_ADDR_SPACE_4,
211 RID_ADDR_SPACE_5,
212 RID_ADDR_SPACE_6,
213 RID_ADDR_SPACE_7,
214 RID_ADDR_SPACE_8,
215 RID_ADDR_SPACE_9,
216 RID_ADDR_SPACE_10,
217 RID_ADDR_SPACE_11,
218 RID_ADDR_SPACE_12,
219 RID_ADDR_SPACE_13,
220 RID_ADDR_SPACE_14,
221 RID_ADDR_SPACE_15,
222
223 RID_FIRST_ADDR_SPACE = RID_ADDR_SPACE_0,
224 RID_LAST_ADDR_SPACE = RID_ADDR_SPACE_15,
225
78a7c317
DD
226 /* __intN keywords. The _N_M here doesn't correspond to the intN
227 in the keyword; use the bitsize in int_n_t_data_t[M] for that.
228 For example, if int_n_t_data_t[0].bitsize is 13, then RID_INT_N_0
229 is for __int13. */
230
231 /* Note that the range to use is RID_FIRST_INT_N through
232 RID_FIRST_INT_N + NUM_INT_N_ENTS - 1 and c-parser.c has a list of
233 all RID_INT_N_* in a case statement. */
234
235 RID_INT_N_0,
236 RID_INT_N_1,
237 RID_INT_N_2,
238 RID_INT_N_3,
239
240 RID_FIRST_INT_N = RID_INT_N_0,
241 RID_LAST_INT_N = RID_INT_N_3,
242
0e5921e8
ZW
243 RID_MAX,
244
245 RID_FIRST_MODIFIER = RID_STATIC,
b8363a24
ZW
246 RID_LAST_MODIFIER = RID_ONEWAY,
247
36a85135
JM
248 RID_FIRST_CXX11 = RID_CONSTEXPR,
249 RID_LAST_CXX11 = RID_STATIC_ASSERT,
b8363a24
ZW
250 RID_FIRST_AT = RID_AT_ENCODE,
251 RID_LAST_AT = RID_AT_IMPLEMENTATION,
252 RID_FIRST_PQ = RID_IN,
668ea4b1 253 RID_LAST_PQ = RID_ONEWAY,
200290f2
NP
254 RID_FIRST_PATTR = RID_GETTER,
255 RID_LAST_PATTR = RID_NONATOMIC
f09f1de5
MM
256};
257
b8363a24 258#define OBJC_IS_AT_KEYWORD(rid) \
3f75a254
JM
259 ((unsigned int) (rid) >= (unsigned int) RID_FIRST_AT && \
260 (unsigned int) (rid) <= (unsigned int) RID_LAST_AT)
b8363a24
ZW
261
262#define OBJC_IS_PQ_KEYWORD(rid) \
3f75a254
JM
263 ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PQ && \
264 (unsigned int) (rid) <= (unsigned int) RID_LAST_PQ)
b8363a24 265
668ea4b1
IS
266#define OBJC_IS_PATTR_KEYWORD(rid) \
267 ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PATTR && \
268 (unsigned int) (rid) <= (unsigned int) RID_LAST_PATTR)
269
1973201f
NP
270/* OBJC_IS_CXX_KEYWORD recognizes the 'CXX_OBJC' keywords (such as
271 'class') which are shared in a subtle way between Objective-C and
272 C++. When the lexer is lexing in Objective-C/Objective-C++, if it
273 finds '@' followed by one of these identifiers (eg, '@class'), it
274 recognizes the whole as an Objective-C keyword. If the identifier
275 is found elsewhere, it follows the rules of the C/C++ language.
276 */
277#define OBJC_IS_CXX_KEYWORD(rid) \
b8fd7909 278 (rid == RID_CLASS || rid == RID_SYNCHRONIZED \
1973201f
NP
279 || rid == RID_PUBLIC || rid == RID_PROTECTED || rid == RID_PRIVATE \
280 || rid == RID_TRY || rid == RID_THROW || rid == RID_CATCH)
281
f09f1de5
MM
282/* The elements of `ridpointers' are identifier nodes for the reserved
283 type names and storage classes. It is indexed by a RID_... value. */
3f75a254 284extern GTY ((length ("(int) RID_MAX"))) tree *ridpointers;
f09f1de5 285
7f4edbcb
BS
286/* Standard named or nameless data types of the C compiler. */
287
288enum c_tree_index
289{
b6baa67d
KVH
290 CTI_CHAR16_TYPE,
291 CTI_CHAR32_TYPE,
7f4edbcb 292 CTI_WCHAR_TYPE,
207bf79d 293 CTI_UNDERLYING_WCHAR_TYPE,
c5ab7f91 294 CTI_WINT_TYPE,
cd732418
JM
295 CTI_SIGNED_SIZE_TYPE, /* For format checking only. */
296 CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only. */
b15ad712
JM
297 CTI_INTMAX_TYPE,
298 CTI_UINTMAX_TYPE,
7f4edbcb
BS
299 CTI_WIDEST_INT_LIT_TYPE,
300 CTI_WIDEST_UINT_LIT_TYPE,
301
207bf79d
JM
302 /* Types for <stdint.h>, that may not be defined on all
303 targets. */
304 CTI_SIG_ATOMIC_TYPE,
305 CTI_INT8_TYPE,
306 CTI_INT16_TYPE,
307 CTI_INT32_TYPE,
308 CTI_INT64_TYPE,
309 CTI_UINT8_TYPE,
310 CTI_UINT16_TYPE,
311 CTI_UINT32_TYPE,
312 CTI_UINT64_TYPE,
313 CTI_INT_LEAST8_TYPE,
314 CTI_INT_LEAST16_TYPE,
315 CTI_INT_LEAST32_TYPE,
316 CTI_INT_LEAST64_TYPE,
317 CTI_UINT_LEAST8_TYPE,
318 CTI_UINT_LEAST16_TYPE,
319 CTI_UINT_LEAST32_TYPE,
320 CTI_UINT_LEAST64_TYPE,
321 CTI_INT_FAST8_TYPE,
322 CTI_INT_FAST16_TYPE,
323 CTI_INT_FAST32_TYPE,
324 CTI_INT_FAST64_TYPE,
325 CTI_UINT_FAST8_TYPE,
326 CTI_UINT_FAST16_TYPE,
327 CTI_UINT_FAST32_TYPE,
328 CTI_UINT_FAST64_TYPE,
329 CTI_INTPTR_TYPE,
330 CTI_UINTPTR_TYPE,
331
7f4edbcb 332 CTI_CHAR_ARRAY_TYPE,
b6baa67d
KVH
333 CTI_CHAR16_ARRAY_TYPE,
334 CTI_CHAR32_ARRAY_TYPE,
7f4edbcb 335 CTI_WCHAR_ARRAY_TYPE,
7f4edbcb
BS
336 CTI_STRING_TYPE,
337 CTI_CONST_STRING_TYPE,
338
19552aa5 339 /* Type for boolean expressions (bool in C++, int in C). */
de7df9eb
JM
340 CTI_TRUTHVALUE_TYPE,
341 CTI_TRUTHVALUE_TRUE,
342 CTI_TRUTHVALUE_FALSE,
343
7f4edbcb 344 CTI_DEFAULT_FUNCTION_TYPE,
7f4edbcb 345
2ba84f36 346 /* These are not types, but we have to look them up all the time. */
0ba8a114
NS
347 CTI_FUNCTION_NAME_DECL,
348 CTI_PRETTY_FUNCTION_NAME_DECL,
349 CTI_C99_FUNCTION_NAME_DECL,
350 CTI_SAVED_FUNCTION_NAME_DECLS,
c22cacf3 351
b2f97e4a
MM
352 CTI_NULL,
353
7f4edbcb
BS
354 CTI_MAX
355};
356
5950c3c9
BE
357#define C_CPP_HASHNODE(id) \
358 (&(((struct c_common_identifier *) (id))->node))
d75d71e0
ILT
359#define C_RID_CODE(id) \
360 ((enum rid) (((struct c_common_identifier *) (id))->node.rid_code))
361#define C_SET_RID_CODE(id, code) \
362 (((struct c_common_identifier *) (id))->node.rid_code = (unsigned char) code)
2a967f3d
NB
363
364/* Identifier part common to the C front ends. Inherits from
365 tree_identifier, despite appearances. */
d1b38208 366struct GTY(()) c_common_identifier {
4f60111f 367 struct tree_common common;
17211ab5 368 struct cpp_hashnode node;
2a967f3d
NB
369};
370
eea1139b
ILT
371/* An entry in the reserved keyword table. */
372
373struct c_common_resword
374{
375 const char *const word;
376 ENUM_BITFIELD(rid) const rid : 16;
377 const unsigned int disable : 16;
378};
379
8fba1830
BRF
380/* Mode used to build pointers (VOIDmode means ptr_mode). */
381
382extern machine_mode c_default_pointer_mode;
383
34429675
JM
384/* Extra cpp_ttype values for C++. */
385
34429675
JM
386/* A token type for template-ids. If a template-id is processed while
387 parsing tentatively, it is replaced with a CPP_TEMPLATE_ID token;
388 the value of the CPP_TEMPLATE_ID is whatever was returned by
389 cp_parser_template_id. */
390#define CPP_TEMPLATE_ID ((enum cpp_ttype) (CPP_KEYWORD + 1))
391
392/* A token type for nested-name-specifiers. If a
393 nested-name-specifier is processed while parsing tentatively, it is
394 replaced with a CPP_NESTED_NAME_SPECIFIER token; the value of the
395 CPP_NESTED_NAME_SPECIFIER is whatever was returned by
396 cp_parser_nested_name_specifier_opt. */
397#define CPP_NESTED_NAME_SPECIFIER ((enum cpp_ttype) (CPP_TEMPLATE_ID + 1))
398
399/* A token type for pre-parsed C++0x decltype. */
400#define CPP_DECLTYPE ((enum cpp_ttype) (CPP_NESTED_NAME_SPECIFIER + 1))
401
5f83e90b
JM
402/* A token type for pre-parsed primary-expression (lambda- or statement-). */
403#define CPP_PREPARSED_EXPR ((enum cpp_ttype) (CPP_DECLTYPE + 1))
404
34429675 405/* The number of token types, including C++-specific ones. */
5f83e90b 406#define N_CP_TTYPES ((int) (CPP_PREPARSED_EXPR + 1))
34429675 407
eea1139b
ILT
408/* Disable mask. Keywords are disabled if (reswords[i].disable &
409 mask) is _true_. Thus for keywords which are present in all
410 languages the disable field is zero. */
411
412#define D_CONLY 0x001 /* C only (not in C++). */
413#define D_CXXONLY 0x002 /* C++ only (not in C). */
414#define D_C99 0x004 /* In C, C99 only. */
36a85135 415#define D_CXX11 0x008 /* In C++, C++11 only. */
eea1139b
ILT
416#define D_EXT 0x010 /* GCC extension. */
417#define D_EXT89 0x020 /* GCC extension incorporated in C99. */
418#define D_ASM 0x040 /* Disabled by -fno-asm. */
419#define D_OBJC 0x080 /* In Objective C and neither C nor C++. */
420#define D_CXX_OBJC 0x100 /* In Objective C, and C++, but not C. */
421#define D_CXXWARN 0x200 /* In C warn with -Wcxx-compat. */
971e17ff 422#define D_CXX_CONCEPTS 0x400 /* In C++, only with concepts. */
b8fd7909 423#define D_TRANSMEM 0X800 /* C++ transactional memory TS. */
971e17ff
AS
424
425#define D_CXX_CONCEPTS_FLAGS D_CXXONLY | D_CXX_CONCEPTS
eea1139b
ILT
426
427/* The reserved keyword table. */
428extern const struct c_common_resword c_common_reswords[];
429
430/* The number of items in the reserved keyword table. */
431extern const unsigned int num_c_common_reswords;
432
b6baa67d
KVH
433#define char16_type_node c_global_trees[CTI_CHAR16_TYPE]
434#define char32_type_node c_global_trees[CTI_CHAR32_TYPE]
7f4edbcb 435#define wchar_type_node c_global_trees[CTI_WCHAR_TYPE]
207bf79d 436#define underlying_wchar_type_node c_global_trees[CTI_UNDERLYING_WCHAR_TYPE]
c5ab7f91 437#define wint_type_node c_global_trees[CTI_WINT_TYPE]
cd732418
JM
438#define signed_size_type_node c_global_trees[CTI_SIGNED_SIZE_TYPE]
439#define unsigned_ptrdiff_type_node c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE]
b15ad712
JM
440#define intmax_type_node c_global_trees[CTI_INTMAX_TYPE]
441#define uintmax_type_node c_global_trees[CTI_UINTMAX_TYPE]
7f4edbcb
BS
442#define widest_integer_literal_type_node c_global_trees[CTI_WIDEST_INT_LIT_TYPE]
443#define widest_unsigned_literal_type_node c_global_trees[CTI_WIDEST_UINT_LIT_TYPE]
444
207bf79d
JM
445#define sig_atomic_type_node c_global_trees[CTI_SIG_ATOMIC_TYPE]
446#define int8_type_node c_global_trees[CTI_INT8_TYPE]
447#define int16_type_node c_global_trees[CTI_INT16_TYPE]
448#define int32_type_node c_global_trees[CTI_INT32_TYPE]
449#define int64_type_node c_global_trees[CTI_INT64_TYPE]
450#define uint8_type_node c_global_trees[CTI_UINT8_TYPE]
ac868f29 451#define c_uint16_type_node c_global_trees[CTI_UINT16_TYPE]
207bf79d
JM
452#define c_uint32_type_node c_global_trees[CTI_UINT32_TYPE]
453#define c_uint64_type_node c_global_trees[CTI_UINT64_TYPE]
454#define int_least8_type_node c_global_trees[CTI_INT_LEAST8_TYPE]
455#define int_least16_type_node c_global_trees[CTI_INT_LEAST16_TYPE]
456#define int_least32_type_node c_global_trees[CTI_INT_LEAST32_TYPE]
457#define int_least64_type_node c_global_trees[CTI_INT_LEAST64_TYPE]
458#define uint_least8_type_node c_global_trees[CTI_UINT_LEAST8_TYPE]
459#define uint_least16_type_node c_global_trees[CTI_UINT_LEAST16_TYPE]
460#define uint_least32_type_node c_global_trees[CTI_UINT_LEAST32_TYPE]
461#define uint_least64_type_node c_global_trees[CTI_UINT_LEAST64_TYPE]
462#define int_fast8_type_node c_global_trees[CTI_INT_FAST8_TYPE]
463#define int_fast16_type_node c_global_trees[CTI_INT_FAST16_TYPE]
464#define int_fast32_type_node c_global_trees[CTI_INT_FAST32_TYPE]
465#define int_fast64_type_node c_global_trees[CTI_INT_FAST64_TYPE]
466#define uint_fast8_type_node c_global_trees[CTI_UINT_FAST8_TYPE]
467#define uint_fast16_type_node c_global_trees[CTI_UINT_FAST16_TYPE]
468#define uint_fast32_type_node c_global_trees[CTI_UINT_FAST32_TYPE]
469#define uint_fast64_type_node c_global_trees[CTI_UINT_FAST64_TYPE]
470#define intptr_type_node c_global_trees[CTI_INTPTR_TYPE]
471#define uintptr_type_node c_global_trees[CTI_UINTPTR_TYPE]
472
de7df9eb
JM
473#define truthvalue_type_node c_global_trees[CTI_TRUTHVALUE_TYPE]
474#define truthvalue_true_node c_global_trees[CTI_TRUTHVALUE_TRUE]
475#define truthvalue_false_node c_global_trees[CTI_TRUTHVALUE_FALSE]
19552aa5 476
7f4edbcb 477#define char_array_type_node c_global_trees[CTI_CHAR_ARRAY_TYPE]
b6baa67d
KVH
478#define char16_array_type_node c_global_trees[CTI_CHAR16_ARRAY_TYPE]
479#define char32_array_type_node c_global_trees[CTI_CHAR32_ARRAY_TYPE]
7f4edbcb 480#define wchar_array_type_node c_global_trees[CTI_WCHAR_ARRAY_TYPE]
7f4edbcb
BS
481#define string_type_node c_global_trees[CTI_STRING_TYPE]
482#define const_string_type_node c_global_trees[CTI_CONST_STRING_TYPE]
483
484#define default_function_type c_global_trees[CTI_DEFAULT_FUNCTION_TYPE]
7f4edbcb 485
0ba8a114
NS
486#define function_name_decl_node c_global_trees[CTI_FUNCTION_NAME_DECL]
487#define pretty_function_name_decl_node c_global_trees[CTI_PRETTY_FUNCTION_NAME_DECL]
488#define c99_function_name_decl_node c_global_trees[CTI_C99_FUNCTION_NAME_DECL]
489#define saved_function_name_decls c_global_trees[CTI_SAVED_FUNCTION_NAME_DECLS]
63ad61ed 490
b2f97e4a
MM
491/* The node for C++ `__null'. */
492#define null_node c_global_trees[CTI_NULL]
493
e2500fed 494extern GTY(()) tree c_global_trees[CTI_MAX];
ab76ca54 495
e0a21ab9
KH
496/* In a RECORD_TYPE, a sorted array of the fields of the type, not a
497 tree for size reasons. */
766090c2 498struct GTY(()) sorted_fields_type {
d07605f5
AP
499 int len;
500 tree GTY((length ("%h.len"))) elts[1];
501};
502
8f17b5c5
MM
503/* Mark which labels are explicitly declared.
504 These may be shadowed, and may be referenced from nested functions. */
505#define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label)
506
a79683d5 507enum c_language_kind
ab76ca54 508{
d73326ca 509 clk_c = 0, /* C90, C94, C99 or C11 */
37fa72e9
NB
510 clk_objc = 1, /* clk_c with ObjC features. */
511 clk_cxx = 2, /* ANSI/ISO C++ */
512 clk_objcxx = 3 /* clk_cxx with ObjC features. */
a79683d5 513};
ab76ca54 514
37fa72e9
NB
515/* To test for a specific language use c_language, defined by each
516 front end. For "ObjC features" or "not C++" use the macros. */
517extern c_language_kind c_language;
518
15a15e8d
RH
519#define c_dialect_cxx() ((c_language & clk_cxx) != 0)
520#define c_dialect_objc() ((c_language & clk_objc) != 0)
37fa72e9 521
dd865ef6 522/* The various name of operator that appears in error messages. */
a79683d5 523enum ref_operator {
dd865ef6
SZ
524 /* NULL */
525 RO_NULL,
526 /* array indexing */
527 RO_ARRAY_INDEXING,
528 /* unary * */
529 RO_UNARY_STAR,
530 /* -> */
531 RO_ARROW,
532 /* implicit conversion */
5e54f81d
MG
533 RO_IMPLICIT_CONVERSION,
534 /* ->* */
535 RO_ARROW_STAR
a79683d5 536};
dd865ef6 537
ae499cce
MM
538/* Information about a statement tree. */
539
d1b38208 540struct GTY(()) stmt_tree_s {
38e01f9e 541 /* A stack of statement lists being collected. */
9771b263 542 vec<tree, va_gc> *x_cur_stmt_list;
325c3691 543
da7d8304 544 /* In C++, Nonzero if we should treat statements as full
04f7a48e 545 expressions. In particular, this variable is non-zero if at the
ae499cce
MM
546 end of a statement we should destroy any temporaries created
547 during that statement. Similarly, if, at the end of a block, we
548 should destroy any local variables in this block. Normally, this
da7d8304 549 variable is nonzero, since those are the normal semantics of
ae499cce
MM
550 C++.
551
ae499cce 552 This flag has no effect in C. */
21c7361e 553 int stmts_are_full_exprs_p;
ae499cce
MM
554};
555
556typedef struct stmt_tree_s *stmt_tree;
557
558/* Global state pertinent to the current function. Some C dialects
559 extend this structure with additional fields. */
560
d1b38208 561struct GTY(()) c_language_function {
ae499cce
MM
562 /* While we are parsing the function, this contains information
563 about the statement-tree that we are building. */
564 struct stmt_tree_s x_stmt_tree;
3797cb21
DS
565
566 /* Vector of locally defined typedefs, for
567 -Wunused-local-typedefs. */
9771b263 568 vec<tree, va_gc> *local_typedefs;
ae499cce
MM
569};
570
38e01f9e
NF
571#define stmt_list_stack (current_stmt_tree ()->x_cur_stmt_list)
572
35fd3193 573/* When building a statement-tree, this is the current statement list
9771b263
DN
574 being collected. */
575#define cur_stmt_list (stmt_list_stack->last ())
38e01f9e 576
9771b263 577#define building_stmt_list_p() (stmt_list_stack && !stmt_list_stack->is_empty())
8f17b5c5
MM
578
579/* Language-specific hooks. */
580
4684cd27
MM
581/* If non-NULL, this function is called after a precompile header file
582 is loaded. */
583extern void (*lang_post_pch_load) (void);
584
f75fbaf7
ZW
585extern void push_file_scope (void);
586extern void pop_file_scope (void);
35b1a6fa 587extern stmt_tree current_stmt_tree (void);
325c3691 588extern tree push_stmt_list (void);
325c3691 589extern tree pop_stmt_list (tree);
35b1a6fa 590extern tree add_stmt (tree);
325c3691 591extern void push_cleanup (tree, tree, bool);
641da50a 592
32e8bb8e 593extern tree build_modify_expr (location_t, tree, tree, enum tree_code,
c2255bc4 594 location_t, tree, tree);
36536d79
BI
595extern tree build_array_notation_expr (location_t, tree, tree, enum tree_code,
596 location_t, tree, tree);
597extern tree build_array_notation_ref (location_t, tree, tree, tree, tree, tree);
dd865ef6 598extern tree build_indirect_ref (location_t, tree, ref_operator);
35b1a6fa 599
d07605f5 600extern int field_decl_cmp (const void *, const void *);
c22cacf3
MS
601extern void resort_sorted_fields (void *, void *, gt_pointer_operator,
602 void *);
58f9752a 603extern bool has_c_linkage (const_tree decl);
1807ffc1 604extern bool c_decl_implicit (const_tree);
17211ab5 605\f
4078b403
NB
606/* Switches common to the C front ends. */
607
63973df3
NB
608/* Nonzero means don't output line number information. */
609
610extern char flag_no_line_commands;
611
612/* Nonzero causes -E output not to be done, but directives such as
613 #define that have side effects are still obeyed. */
614
615extern char flag_no_output;
616
93d45d9e
JM
617/* Nonzero means dump macros in some fashion; contains the 'D', 'M',
618 'N' or 'U' of the command line switch. */
63973df3
NB
619
620extern char flag_dump_macros;
621
622/* Nonzero means pass #include lines through to the output. */
623
624extern char flag_dump_includes;
625
c0d578e6
GK
626/* Nonzero means process PCH files while preprocessing. */
627
628extern bool flag_pch_preprocess;
629
17211ab5
GK
630/* The file name to which we should write a precompiled header, or
631 NULL if no header will be written in this compile. */
632
633extern const char *pch_file;
634
3df89291
NB
635/* Nonzero if an ISO standard was selected. It rejects macros in the
636 user's namespace. */
17211ab5 637
3df89291
NB
638extern int flag_iso;
639
4078b403 640/* C/ObjC language option variables. */
b34c7881 641
2683ed8d 642
4078b403
NB
643/* Nonzero means allow type mismatches in conditional expressions;
644 just make their values `void'. */
74ff4629 645
4078b403 646extern int flag_cond_mismatch;
6c36d76b 647
eaf299c6 648/* Nonzero means enable C89 Amendment 1 features. */
b8458e3e
JM
649
650extern int flag_isoc94;
651
48b0b196 652/* Nonzero means use the ISO C99 (or C11) dialect of C. */
ab76ca54
MM
653
654extern int flag_isoc99;
655
48b0b196 656/* Nonzero means use the ISO C11 dialect of C. */
2778d766 657
48b0b196 658extern int flag_isoc11;
2778d766 659
6614fd40 660/* Nonzero means that we have builtin functions, and main is an int. */
93e2382f
JM
661
662extern int flag_hosted;
663
4078b403
NB
664/* ObjC language option variables. */
665
666
4078b403
NB
667/* Tells the compiler that this is a special run. Do not perform any
668 compiling, instead we are to test some platform dependent features
669 and output a C header file with appropriate definitions. */
670
671extern int print_struct_values;
672
abc88a08 673/* Tells the compiler what is the constant string class for ObjC. */
4078b403 674
fd350d24 675extern const char *constant_string_class_name;
4078b403 676
4078b403
NB
677
678/* C++ language option variables. */
679
a75f1574
JM
680/* The reference version of the ABI for -Wabi. */
681
682extern int warn_abi_version;
4078b403 683
62984918 684/* Return TRUE if one of {flag_abi_version,flag_abi_compat_version} is
a75f1574
JM
685 less than N and the other is at least N. */
686#define abi_compat_version_crosses(N) \
62984918
JM
687 (abi_version_at_least(N) \
688 != (flag_abi_compat_version == 0 \
689 || flag_abi_compat_version >= (N)))
690
a75f1574
JM
691/* Return TRUE if one of {flag_abi_version,warn_abi_version} is
692 less than N and the other is at least N, for use by -Wabi. */
693#define abi_version_crosses(N) \
694 (abi_version_at_least(N) \
695 != (warn_abi_version == 0 \
696 || warn_abi_version >= (N)))
697
4078b403
NB
698/* Nonzero means generate separate instantiation control files and
699 juggle them at link time. */
700
701extern int flag_use_repository;
702
c1ae8be5
SM
703/* The supported C++ dialects. */
704
705enum cxx_dialect {
129211bc 706 cxx_unset,
97e3ad20 707 /* C++98 with TC1 */
c1ae8be5 708 cxx98,
97e3ad20
JM
709 cxx03 = cxx98,
710 /* C++11 */
711 cxx0x,
552b8185 712 cxx11 = cxx0x,
028aee17
JM
713 /* C++14 */
714 cxx14,
da73100b
JM
715 /* C++1z (C++17?) */
716 cxx1z
c1ae8be5 717};
966541e3 718
c1ae8be5
SM
719/* The C++ dialect being used. C++98 is the default. */
720extern enum cxx_dialect cxx_dialect;
966541e3 721
4078b403
NB
722/* Maximum template instantiation depth. This limit is rather
723 arbitrary, but it exists to limit the time it takes to notice
17bc631c 724 excessively recursive template instantiations. */
4078b403
NB
725
726extern int max_tinst_depth;
ab76ca54 727
7d882b83
ILT
728/* Nonzero means that we should not issue warnings about problems that
729 occur when the code is executed, because the code being processed
730 is not expected to be executed. This is set during parsing. This
731 is used for cases like sizeof() and "0 ? a : b". This is a count,
732 not a bool, because unexecuted expressions can nest. */
25587e40 733
7d882b83 734extern int c_inhibit_evaluation_warnings;
25587e40 735
148e4216
JM
736/* Whether lexing has been completed, so subsequent preprocessor
737 errors should use the compiler's input_location. */
738
739extern bool done_lexing;
740
ab76ca54
MM
741/* C types are partitioned into three subsets: object, function, and
742 incomplete types. */
743#define C_TYPE_OBJECT_P(type) \
744 (TREE_CODE (type) != FUNCTION_TYPE && TYPE_SIZE (type))
745
746#define C_TYPE_INCOMPLETE_P(type) \
747 (TREE_CODE (type) != FUNCTION_TYPE && TYPE_SIZE (type) == 0)
748
749#define C_TYPE_FUNCTION_P(type) \
750 (TREE_CODE (type) == FUNCTION_TYPE)
751
752/* For convenience we define a single macro to identify the class of
753 object or incomplete types. */
754#define C_TYPE_OBJECT_OR_INCOMPLETE_P(type) \
755 (!C_TYPE_FUNCTION_P (type))
756
c98cd5bf
JM
757struct visibility_flags
758{
759 unsigned inpragma : 1; /* True when in #pragma GCC visibility. */
760 unsigned inlines_hidden : 1; /* True when -finlineshidden in effect. */
761};
762
7a37fa90
MM
763/* These enumerators are possible types of unsafe conversions. */
764enum conversion_safety {
765 /* The conversion is safe. */
766 SAFE_CONVERSION = 0,
767 /* Another type of conversion with problems. */
768 UNSAFE_OTHER,
769 /* Conversion between signed and unsigned integers
770 which are all warned about immediately, so this is unused. */
771 UNSAFE_SIGN,
772 /* Conversions that reduce the precision of reals including conversions
773 from reals to integers. */
774 UNSAFE_REAL,
775 /* Conversions from complex to reals or integers, that discard imaginary
776 component. */
777 UNSAFE_IMAGINARY
778};
49b0aa18 779
c98cd5bf
JM
780/* Global visibility options. */
781extern struct visibility_flags visibility_options;
782
349ae713
NB
783/* Attribute table common to the C front ends. */
784extern const struct attribute_spec c_common_attribute_table[];
785extern const struct attribute_spec c_common_format_attribute_table[];
786
0ba8a114 787/* Pointer to function to lazily generate the VAR_DECL for __FUNCTION__ etc.
2ce07e2d
NS
788 ID is the identifier to use, NAME is the string.
789 TYPE_DEP indicates whether it depends on type of the function or not
790 (i.e. __PRETTY_FUNCTION__). */
791
c2255bc4 792extern tree (*make_fname_decl) (location_t, tree, int);
35b1a6fa 793
bffad7f1 794/* In c-decl.c and cp/tree.c. FIXME. */
3ef0694c 795extern void c_register_addr_space (const char *str, addr_space_t as);
bffad7f1
SB
796
797/* In c-common.c. */
5386338c 798extern bool in_late_binary_op;
36c5e70a 799extern const char *c_addr_space_name (addr_space_t as);
35b1a6fa 800extern tree identifier_global_value (tree);
3a636414 801extern tree c_linkage_bindings (tree);
35b1a6fa
AJ
802extern void record_builtin_type (enum rid, const char *, tree);
803extern tree build_void_list_node (void);
804extern void start_fname_decls (void);
805extern void finish_fname_decls (void);
806extern const char *fname_as_string (int);
3ba09659 807extern tree fname_decl (location_t, unsigned, tree);
35b1a6fa 808
d19fa6b5 809extern int check_user_alignment (const_tree, bool);
4227c9ad
JJ
810extern bool check_function_arguments (location_t loc, const_tree, const_tree,
811 int, tree *);
35b1a6fa
AJ
812extern void check_function_arguments_recurse (void (*)
813 (void *, tree,
814 unsigned HOST_WIDE_INT),
815 void *, tree,
816 unsigned HOST_WIDE_INT);
79ce98bc
MP
817extern bool check_builtin_function_arguments (location_t, vec<location_t>,
818 tree, int, tree *);
94a0dd7b 819extern void check_function_format (tree, int, tree *);
81fea426 820extern bool attribute_fallthrough_p (tree);
35b1a6fa
AJ
821extern tree handle_format_attribute (tree *, tree, tree, int, bool *);
822extern tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
a4d8c676 823extern bool c_common_handle_option (size_t, const char *, int, int, location_t,
5f20c657 824 const struct cl_option_handlers *);
acce4e77 825extern bool default_handle_c_option (size_t, const char *, int);
ef4bddc2 826extern tree c_common_type_for_mode (machine_mode, int);
35b1a6fa 827extern tree c_common_type_for_size (unsigned int, int);
ab22c1fa
CF
828extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned int,
829 int, int);
12753674 830extern tree c_common_unsigned_type (tree);
35b1a6fa
AJ
831extern tree c_common_signed_type (tree);
832extern tree c_common_signed_or_unsigned_type (int, tree);
81f653d6 833extern void c_common_init_ts (void);
38a4afee 834extern tree c_build_bitfield_integer_type (unsigned HOST_WIDE_INT, int);
3cd211af 835extern enum conversion_safety unsafe_conversion_p (location_t, tree, tree, tree,
68fca595 836 bool);
58f9752a 837extern bool decl_with_nonnull_addr_p (const_tree);
928c19bb 838extern tree c_fully_fold (tree, bool, bool *);
e5a94231 839extern tree c_wrap_maybe_const (tree, bool);
ba47d38d 840extern tree c_common_truthvalue_conversion (location_t, tree);
35b1a6fa 841extern void c_apply_type_quals_to_decl (int, tree);
296674db 842extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int);
c2255bc4 843extern tree c_alignof_expr (location_t, tree);
7f4edbcb
BS
844/* Print an error message for invalid operands to arith operation CODE.
845 NOP_EXPR is used as a special case (see truthvalue_conversion). */
745e411d 846extern void binary_op_error (rich_location *, enum tree_code, tree, tree);
35b1a6fa 847extern tree fix_string_type (tree);
68fca595 848extern tree convert_and_check (location_t, tree, tree);
b2ca3702 849extern bool c_determine_visibility (tree);
0af94e6f 850extern bool vector_types_compatible_elements_p (tree, tree);
6ec637a4
JJ
851extern void mark_valid_location_for_stdc_pragma (bool);
852extern bool valid_location_for_stdc_pragma_p (void);
853extern void set_float_const_decimal64 (void);
854extern void clear_float_const_decimal64 (void);
855extern bool float_const_decimal64_p (void);
ab76ca54 856
a9aa2c3a
NF
857extern bool keyword_begins_type_specifier (enum rid);
858extern bool keyword_is_storage_class_specifier (enum rid);
859extern bool keyword_is_type_qualifier (enum rid);
ba9e6dd5 860extern bool keyword_is_decl_specifier (enum rid);
af63ba4b 861extern unsigned max_align_t_align (void);
e28d52cf 862extern bool cxx_fundamental_alignment_p (unsigned);
f04dda30 863extern bool pointer_to_zero_sized_aggr_p (tree);
038b5cc0
MP
864extern bool bool_promoted_to_int_p (tree);
865extern tree fold_for_warn (tree);
866extern tree c_common_get_narrower (tree, int *);
b12b1915 867extern bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *);
a9aa2c3a 868
296674db
JM
869#define c_sizeof(LOC, T) c_sizeof_or_alignof_type (LOC, T, true, false, 1)
870#define c_alignof(LOC, T) c_sizeof_or_alignof_type (LOC, T, false, false, 1)
7f4edbcb 871
6715192c
MLI
872/* Subroutine of build_binary_op, used for certain operations. */
873extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwise);
874
7f4edbcb
BS
875/* Subroutine of build_binary_op, used for comparison operations.
876 See if the operands have both been converted from subword integer types
877 and, if so, perhaps change them both back to their original type. */
393e8e8b
MP
878extern tree shorten_compare (location_t, tree *, tree *, tree *,
879 enum tree_code *);
7f4edbcb 880
fd9b0f32
PC
881extern tree pointer_int_sum (location_t, enum tree_code, tree, tree,
882 bool = true);
50e60bc3
ZW
883
884/* Add qualifiers to a type, in the fashion for C. */
e9e32ee6 885extern tree c_build_qualified_type (tree, int, tree = NULL_TREE, size_t = 0);
50e60bc3 886
7f4edbcb
BS
887/* Build tree nodes and builtin functions common to both C and C++ language
888 frontends. */
35b1a6fa 889extern void c_common_nodes_and_builtins (void);
d3707adb 890
35b1a6fa 891extern void disable_builtin_function (const char *);
7d14c755 892
3b2db49f
MM
893extern void set_compound_literal_name (tree decl);
894
c2255bc4 895extern tree build_va_arg (location_t, tree, tree);
7e8176d7 896
c5fa0890 897extern const unsigned int c_family_lang_mask;
7a9bf9a4 898extern unsigned int c_common_option_lang_mask (void);
d723bb7c 899extern void c_common_diagnostics_set_defaults (diagnostic_context *);
7a9bf9a4 900extern bool c_common_complain_wrong_lang_p (const struct cl_option *);
a75bfaa6 901extern void c_common_init_options_struct (struct gcc_options *);
7a9bf9a4 902extern void c_common_init_options (unsigned int, struct cl_decoded_option *);
35b1a6fa
AJ
903extern bool c_common_post_options (const char **);
904extern bool c_common_init (void);
905extern void c_common_finish (void);
b37421c6 906extern void c_common_parse_file (void);
1a817418 907extern FILE *get_dump_info (int, dump_flags_t *);
4862826d 908extern alias_set_type c_common_get_alias_set (tree);
9649812a 909extern void c_register_builtin_type (tree, const char*);
58f9752a 910extern bool c_promoting_integer_type_p (const_tree);
e3455240 911extern bool self_promoting_args_p (const_tree);
12ea3302 912extern tree strip_pointer_operator (tree);
ba992967 913extern tree strip_pointer_or_array_types (tree);
c5ff069d 914extern HOST_WIDE_INT c_common_to_target_charset (HOST_WIDE_INT);
d7e7759d 915
d1bd0ded
GK
916/* This is the basic parsing function. */
917extern void c_parse_file (void);
d1bd0ded 918
d7438551
AH
919extern void c_parse_final_cleanups (void);
920
ae499cce
MM
921/* These macros provide convenient access to the various _STMT nodes. */
922
325c3691
RH
923/* Nonzero if a given STATEMENT_LIST represents the outermost binding
924 if a statement expression. */
925#define STATEMENT_LIST_STMT_EXPR(NODE) \
926 TREE_LANG_FLAG_1 (STATEMENT_LIST_CHECK (NODE))
174283a3
RH
927
928/* Nonzero if a label has been added to the statement list. */
929#define STATEMENT_LIST_HAS_LABEL(NODE) \
930 TREE_LANG_FLAG_3 (STATEMENT_LIST_CHECK (NODE))
325c3691 931
928c19bb
JM
932/* C_MAYBE_CONST_EXPR accessors. */
933#define C_MAYBE_CONST_EXPR_PRE(NODE) \
934 TREE_OPERAND (C_MAYBE_CONST_EXPR_CHECK (NODE), 0)
935#define C_MAYBE_CONST_EXPR_EXPR(NODE) \
936 TREE_OPERAND (C_MAYBE_CONST_EXPR_CHECK (NODE), 1)
937#define C_MAYBE_CONST_EXPR_INT_OPERANDS(NODE) \
938 TREE_LANG_FLAG_0 (C_MAYBE_CONST_EXPR_CHECK (NODE))
939#define C_MAYBE_CONST_EXPR_NON_CONST(NODE) \
940 TREE_LANG_FLAG_1 (C_MAYBE_CONST_EXPR_CHECK (NODE))
941#define EXPR_INT_CONST_OPERANDS(EXPR) \
942 (INTEGRAL_TYPE_P (TREE_TYPE (EXPR)) \
943 && (TREE_CODE (EXPR) == INTEGER_CST \
944 || (TREE_CODE (EXPR) == C_MAYBE_CONST_EXPR \
945 && C_MAYBE_CONST_EXPR_INT_OPERANDS (EXPR))))
946
0a7394bc
MM
947/* In a FIELD_DECL, nonzero if the decl was originally a bitfield. */
948#define DECL_C_BIT_FIELD(NODE) \
949 (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) == 1)
950#define SET_DECL_C_BIT_FIELD(NODE) \
951 (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 1)
952#define CLEAR_DECL_C_BIT_FIELD(NODE) \
953 (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 0)
954
c2255bc4
AH
955extern tree do_case (location_t, tree, tree);
956extern tree build_stmt (location_t, enum tree_code, ...);
fb52b50a 957extern tree build_real_imag_expr (location_t, enum tree_code, tree);
f2c5f623 958
ab76ca54
MM
959/* These functions must be defined by each front-end which implements
960 a variant of the C language. They are used in c-common.c. */
961
e51fbec3 962extern tree build_unary_op (location_t, enum tree_code, tree, bool);
ba47d38d 963extern tree build_binary_op (location_t, enum tree_code, tree, tree, int);
522ddfa2 964extern tree perform_integral_promotions (tree);
ab76ca54 965
d593cb3d
MS
966/* These functions must be defined by each front-end which implements
967 a variant of the C language. They are used by port files. */
968
969extern tree default_conversion (tree);
970
ab76ca54
MM
971/* Given two integer or real types, return the type for their sum.
972 Given two compatible ANSI C types, returns the merged type. */
973
35b1a6fa 974extern tree common_type (tree, tree);
44835fdd 975
35b1a6fa 976extern tree decl_constant_value (tree);
56cb9733 977
19552aa5 978/* Handle increment and decrement of boolean types. */
35b1a6fa 979extern tree boolean_increment (enum tree_code, tree);
19552aa5 980
35b1a6fa 981extern int case_compare (splay_tree_key, splay_tree_key);
8f17b5c5 982
b155cfd9
MP
983extern tree c_add_case_label (location_t, splay_tree, tree, tree, tree, tree,
984 bool *);
8f17b5c5 985
c2255bc4 986extern tree build_function_call (location_t, tree, tree);
c70eaeaf 987
81e5eca8
MP
988extern tree build_function_call_vec (location_t, vec<location_t>, tree,
989 vec<tree, va_gc> *, vec<tree, va_gc> *);
bbbbb16a 990
9771b263 991extern tree resolve_overloaded_builtin (location_t, tree, vec<tree, va_gc> *);
48ae6c13 992
6a3799eb 993extern tree finish_label_address_expr (tree, location_t);
15b732b2
NB
994
995/* Same function prototype, but the C and C++ front ends have
996 different implementations. Used in c-common.c. */
35b1a6fa 997extern tree lookup_label (tree);
10e6657a 998extern tree lookup_name (tree);
1e4ae551 999extern bool lvalue_p (const_tree);
15b732b2 1000
1a4f11c8
DM
1001enum lookup_name_fuzzy_kind {
1002 /* Names of types. */
1003 FUZZY_LOOKUP_TYPENAME,
1004
ddbbcb19
JJ
1005 /* Names of function decls. */
1006 FUZZY_LOOKUP_FUNCTION_NAME,
1007
1a4f11c8
DM
1008 /* Any name. */
1009 FUZZY_LOOKUP_NAME
1010};
de6a69ee 1011extern const char *lookup_name_fuzzy (tree, enum lookup_name_fuzzy_kind);
1a4f11c8 1012
f83c7f63 1013extern bool vector_targets_convertible_p (const_tree t1, const_tree t2);
58f9752a 1014extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note);
bedc293e 1015extern tree c_build_vec_perm_expr (location_t, tree, tree, tree, bool = true);
cc27e657 1016
35b1a6fa 1017extern void init_c_lex (void);
81a75f0f 1018
35b1a6fa 1019extern void c_cpp_builtins (cpp_reader *);
ab442df7 1020extern void c_cpp_builtins_optimize_pragma (cpp_reader *, tree, tree);
8a645150 1021extern bool c_cpp_error (cpp_reader *, int, int, rich_location *,
59cc9210 1022 const char *, va_list *)
8a645150 1023 ATTRIBUTE_GCC_DIAG(5,0);
1f8d3e84 1024extern int c_common_has_attribute (cpp_reader *);
76c3e73e 1025
7c475d11
JM
1026extern bool parse_optimize_options (tree, bool);
1027
731e8b38
MM
1028/* Positive if an implicit `extern "C"' scope has just been entered;
1029 negative if such a scope has just been exited. */
7876228d 1030extern GTY(()) int pending_lang_change;
731e8b38 1031
0e5921e8
ZW
1032/* Information recorded about each file examined during compilation. */
1033
1034struct c_fileinfo
1035{
1036 int time; /* Time spent in the file. */
5d709b00
ZW
1037
1038 /* Flags used only by C++.
1039 INTERFACE_ONLY nonzero means that we are in an "interface" section
1040 of the compiler. INTERFACE_UNKNOWN nonzero means we cannot trust
1041 the value of INTERFACE_ONLY. If INTERFACE_UNKNOWN is zero and
1042 INTERFACE_ONLY is zero, it means that we are responsible for
1043 exporting definitions that others might need. */
1044 short interface_only;
0e5921e8
ZW
1045 short interface_unknown;
1046};
1047
35b1a6fa
AJ
1048struct c_fileinfo *get_fileinfo (const char *);
1049extern void dump_time_statistics (void);
1050
1051extern bool c_dump_tree (void *, tree);
1052
3a5b9284
RH
1053extern void verify_sequence_points (tree);
1054
c85158de 1055extern tree fold_offsetof_1 (tree, tree_code ctx = ERROR_MARK);
cf9e9959 1056extern tree fold_offsetof (tree);
ee8a6a3e 1057
aab038d5
RH
1058extern int complete_array_type (tree *, tree, bool);
1059
48ae6c13
RH
1060extern tree builtin_type_for_size (int, bool);
1061
30cd1c5d
AS
1062extern void c_common_mark_addressable_vec (tree);
1063
770e5a2e 1064extern void set_underlying_type (tree);
040d18b6 1065extern void record_types_used_by_current_var_decl (tree);
9771b263
DN
1066extern vec<tree, va_gc> *make_tree_vector (void);
1067extern void release_tree_vector (vec<tree, va_gc> *);
1068extern vec<tree, va_gc> *make_tree_vector_single (tree);
1069extern vec<tree, va_gc> *make_tree_vector_from_list (tree);
f1644724 1070extern vec<tree, va_gc> *make_tree_vector_from_ctor (tree);
9771b263 1071extern vec<tree, va_gc> *make_tree_vector_copy (const vec<tree, va_gc> *);
2a67bec2 1072
793c625f
MG
1073/* Used for communication between c_common_type_for_mode and
1074 c_register_builtin_type. */
1075extern GTY(()) tree registered_builtin_types;
1076
15c98b2e
ES
1077/* Read SOURCE_DATE_EPOCH from environment to have a deterministic
1078 timestamp to replace embedded current dates to get reproducible
1079 results. Returns -1 if SOURCE_DATE_EPOCH is not defined. */
1080extern time_t cb_get_source_date_epoch (cpp_reader *pfile);
1081
1082/* The value (as a unix timestamp) corresponds to date
1083 "Dec 31 9999 23:59:59 UTC", which is the latest date that __DATE__ and
1084 __TIME__ can store. */
1085#define MAX_SOURCE_DATE_EPOCH HOST_WIDE_INT_C (253402300799)
1086
cb18fd07
DM
1087/* Callback for libcpp for offering spelling suggestions for misspelled
1088 directives. */
1089extern const char *cb_get_suggestion (cpp_reader *, const char *,
1090 const char *const *);
1091
88fa5555
DM
1092extern GTY(()) string_concat_db *g_string_concat_db;
1093
e5106e27
DM
1094class substring_loc;
1095extern const char *c_get_substring_location (const substring_loc &substr_loc,
1096 location_t *out_loc);
88fa5555 1097
7c34ced1 1098/* In c-gimplify.c */
6de9cd9a 1099extern void c_genericize (tree);
726a989a 1100extern int c_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
c2255bc4 1101extern tree c_build_bind_expr (location_t, tree, tree);
6de9cd9a 1102
de67c4c3
DM
1103/* In c-lex.c. */
1104extern enum cpp_ttype
1105conflict_marker_get_final_tok_kind (enum cpp_ttype tok1_kind);
1106
c0d578e6 1107/* In c-pch.c */
35b1a6fa 1108extern void pch_init (void);
1efcb8c6 1109extern void pch_cpp_save_state (void);
35b1a6fa
AJ
1110extern int c_common_valid_pch (cpp_reader *pfile, const char *name, int fd);
1111extern void c_common_read_pch (cpp_reader *pfile, const char *name, int fd,
1112 const char *orig);
1113extern void c_common_write_pch (void);
18c81520 1114extern void c_common_no_more_pch (void);
bc4071dd 1115extern void c_common_pch_pragma (cpp_reader *pfile, const char *);
3fd30b88
GK
1116
1117/* In *-checksum.c */
1118extern const unsigned char executable_checksum[16];
c0d578e6 1119
ab442df7
MM
1120/* In c-cppbuiltin.c */
1121extern void builtin_define_std (const char *macro);
35b1a6fa 1122extern void builtin_define_with_value (const char *, const char *, int);
7049e4eb
CB
1123extern void builtin_define_with_int_value (const char *, HOST_WIDE_INT);
1124extern void builtin_define_type_sizeof (const char *, tree);
35b1a6fa 1125extern void c_stddef_cpp_builtins (void);
0e50b624 1126extern void fe_file_change (const line_map_ordinary *);
cfc93532 1127extern void c_parse_error (const char *, enum cpp_ttype, tree, unsigned char);
9d10c9a9
NB
1128
1129/* In c-ppoutput.c */
35b1a6fa
AJ
1130extern void init_pp_output (FILE *);
1131extern void preprocess_file (cpp_reader *);
0e50b624 1132extern void pp_file_change (const line_map_ordinary *);
8e9ea4d7 1133extern void pp_dir_change (cpp_reader *, const char *);
104f8784 1134extern bool check_missing_format_attribute (tree, tree);
17211ab5 1135
953ff289 1136/* In c-omp.c */
acf0174b
JJ
1137struct omp_clause_mask
1138{
1139 inline omp_clause_mask ();
8848828b
JJ
1140 inline omp_clause_mask (uint64_t l);
1141 inline omp_clause_mask (uint64_t l, uint64_t h);
acf0174b
JJ
1142 inline omp_clause_mask &operator &= (omp_clause_mask);
1143 inline omp_clause_mask &operator |= (omp_clause_mask);
1144 inline omp_clause_mask operator ~ () const;
1145 inline omp_clause_mask operator & (omp_clause_mask) const;
1146 inline omp_clause_mask operator | (omp_clause_mask) const;
1147 inline omp_clause_mask operator >> (int);
1148 inline omp_clause_mask operator << (int);
1149 inline bool operator == (omp_clause_mask) const;
acd15a28 1150 inline bool operator != (omp_clause_mask) const;
8848828b 1151 uint64_t low, high;
acf0174b
JJ
1152};
1153
1154inline
1155omp_clause_mask::omp_clause_mask ()
1156{
1157}
1158
1159inline
8848828b 1160omp_clause_mask::omp_clause_mask (uint64_t l)
acf0174b
JJ
1161: low (l), high (0)
1162{
1163}
1164
1165inline
8848828b 1166omp_clause_mask::omp_clause_mask (uint64_t l, uint64_t h)
acf0174b
JJ
1167: low (l), high (h)
1168{
1169}
1170
1171inline omp_clause_mask &
1172omp_clause_mask::operator &= (omp_clause_mask b)
1173{
1174 low &= b.low;
1175 high &= b.high;
1176 return *this;
1177}
1178
1179inline omp_clause_mask &
1180omp_clause_mask::operator |= (omp_clause_mask b)
1181{
1182 low |= b.low;
1183 high |= b.high;
1184 return *this;
1185}
1186
1187inline omp_clause_mask
1188omp_clause_mask::operator ~ () const
1189{
1190 omp_clause_mask ret (~low, ~high);
1191 return ret;
1192}
1193
1194inline omp_clause_mask
1195omp_clause_mask::operator | (omp_clause_mask b) const
1196{
1197 omp_clause_mask ret (low | b.low, high | b.high);
1198 return ret;
1199}
1200
1201inline omp_clause_mask
1202omp_clause_mask::operator & (omp_clause_mask b) const
1203{
1204 omp_clause_mask ret (low & b.low, high & b.high);
1205 return ret;
1206}
1207
1208inline omp_clause_mask
1209omp_clause_mask::operator << (int amount)
1210{
1211 omp_clause_mask ret;
8848828b 1212 if (amount >= 64)
acf0174b
JJ
1213 {
1214 ret.low = 0;
8848828b 1215 ret.high = low << (amount - 64);
acf0174b
JJ
1216 }
1217 else if (amount == 0)
1218 ret = *this;
1219 else
1220 {
1221 ret.low = low << amount;
8848828b 1222 ret.high = (low >> (64 - amount)) | (high << amount);
acf0174b
JJ
1223 }
1224 return ret;
1225}
1226
1227inline omp_clause_mask
1228omp_clause_mask::operator >> (int amount)
1229{
1230 omp_clause_mask ret;
8848828b 1231 if (amount >= 64)
acf0174b 1232 {
8848828b 1233 ret.low = high >> (amount - 64);
acf0174b
JJ
1234 ret.high = 0;
1235 }
1236 else if (amount == 0)
1237 ret = *this;
1238 else
1239 {
8848828b 1240 ret.low = (high << (64 - amount)) | (low >> amount);
acf0174b
JJ
1241 ret.high = high >> amount;
1242 }
1243 return ret;
1244}
1245
1246inline bool
1247omp_clause_mask::operator == (omp_clause_mask b) const
1248{
1249 return low == b.low && high == b.high;
1250}
1251
acd15a28
JJ
1252inline bool
1253omp_clause_mask::operator != (omp_clause_mask b) const
1254{
1255 return low != b.low || high != b.high;
1256}
1257
8848828b 1258#define OMP_CLAUSE_MASK_1 omp_clause_mask (1)
acf0174b
JJ
1259
1260enum c_omp_clause_split
1261{
1262 C_OMP_CLAUSE_SPLIT_TARGET = 0,
1263 C_OMP_CLAUSE_SPLIT_TEAMS,
1264 C_OMP_CLAUSE_SPLIT_DISTRIBUTE,
1265 C_OMP_CLAUSE_SPLIT_PARALLEL,
1266 C_OMP_CLAUSE_SPLIT_FOR,
1267 C_OMP_CLAUSE_SPLIT_SIMD,
1268 C_OMP_CLAUSE_SPLIT_COUNT,
d9a6bd32
JJ
1269 C_OMP_CLAUSE_SPLIT_SECTIONS = C_OMP_CLAUSE_SPLIT_FOR,
1270 C_OMP_CLAUSE_SPLIT_TASKLOOP = C_OMP_CLAUSE_SPLIT_FOR
acf0174b
JJ
1271};
1272
77886428
CP
1273enum c_omp_region_type
1274{
1275 C_ORT_OMP = 1 << 0,
1276 C_ORT_CILK = 1 << 1,
1277 C_ORT_ACC = 1 << 2,
1278 C_ORT_DECLARE_SIMD = 1 << 3,
1d793c34 1279 C_ORT_OMP_DECLARE_SIMD = C_ORT_OMP | C_ORT_DECLARE_SIMD
77886428
CP
1280};
1281
c2255bc4 1282extern tree c_finish_omp_master (location_t, tree);
acf0174b 1283extern tree c_finish_omp_taskgroup (location_t, tree);
d9a6bd32
JJ
1284extern tree c_finish_omp_critical (location_t, tree, tree, tree);
1285extern tree c_finish_omp_ordered (location_t, tree, tree);
c2255bc4 1286extern void c_finish_omp_barrier (location_t);
20906c66 1287extern tree c_finish_omp_atomic (location_t, enum tree_code, enum tree_code,
e01d41e5
JJ
1288 tree, tree, tree, tree, tree, bool, bool,
1289 bool = false);
c2255bc4
AH
1290extern void c_finish_omp_flush (location_t);
1291extern void c_finish_omp_taskwait (location_t);
20906c66 1292extern void c_finish_omp_taskyield (location_t);
acf0174b 1293extern tree c_finish_omp_for (location_t, enum tree_code, tree, tree, tree,
d9a6bd32 1294 tree, tree, tree, tree);
e01d41e5
JJ
1295extern bool c_omp_check_loop_iv (tree, tree, walk_tree_lh);
1296extern bool c_omp_check_loop_iv_exprs (location_t, tree, tree, tree, tree,
1297 walk_tree_lh);
41dbbb37 1298extern tree c_finish_oacc_wait (location_t, tree, tree);
e7ff0319 1299extern tree c_oacc_split_loop_clauses (tree, tree *, bool);
acf0174b
JJ
1300extern void c_omp_split_clauses (location_t, enum tree_code, omp_clause_mask,
1301 tree, tree *);
1302extern tree c_omp_declare_simd_clauses_to_numbers (tree, tree);
1303extern void c_omp_declare_simd_clauses_to_decls (tree, tree);
953ff289
DN
1304extern enum omp_clause_default_kind c_omp_predetermined_sharing (tree);
1305
56300785
JJ
1306/* Return next tree in the chain for chain_next walking of tree nodes. */
1307static inline tree
1308c_tree_chain_next (tree t)
1309{
1310 /* TREE_CHAIN of a type is TYPE_STUB_DECL, which is different
1311 kind of object, never a long chain of nodes. Prefer
1312 TYPE_NEXT_VARIANT for types. */
1313 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPE_COMMON))
1314 return TYPE_NEXT_VARIANT (t);
1315 /* Otherwise, if there is TREE_CHAIN, return it. */
1316 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_COMMON))
1317 return TREE_CHAIN (t);
1318 return NULL;
1319}
1320
0a35513e
AH
1321/* Mask used by tm_stmt_attr. */
1322#define TM_STMT_ATTR_OUTER 2
1323#define TM_STMT_ATTR_ATOMIC 4
1324#define TM_STMT_ATTR_RELAXED 8
1325
0a35513e
AH
1326/* Mask used by tm_attr_to_mask and tm_mask_to_attr. Note that these
1327 are ordered specifically such that more restrictive attributes are
1328 at lower bit positions. This fact is known by the C++ tm attribute
1329 inheritance code such that least bit extraction (mask & -mask) results
1330 in the most restrictive attribute. */
1331#define TM_ATTR_SAFE 1
1332#define TM_ATTR_CALLABLE 2
1333#define TM_ATTR_PURE 4
1334#define TM_ATTR_IRREVOCABLE 8
1335#define TM_ATTR_MAY_CANCEL_OUTER 16
1336
3ce4f9e4
ESR
1337/* A suffix-identifier value doublet that represents user-defined literals
1338 for C++-0x. */
2d7aa578
ESR
1339enum overflow_type {
1340 OT_UNDERFLOW = -1,
1341 OT_NONE,
1342 OT_OVERFLOW
1343};
1344
3ce4f9e4
ESR
1345struct GTY(()) tree_userdef_literal {
1346 struct tree_base base;
1347 tree suffix_id;
1348 tree value;
1349 tree num_string;
2d7aa578 1350 enum overflow_type overflow;
3ce4f9e4
ESR
1351};
1352
1353#define USERDEF_LITERAL_SUFFIX_ID(NODE) \
1354 (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->suffix_id)
1355
1356#define USERDEF_LITERAL_VALUE(NODE) \
1357 (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->value)
1358
2d7aa578
ESR
1359#define USERDEF_LITERAL_OVERFLOW(NODE) \
1360 (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->overflow)
1361
3ce4f9e4
ESR
1362#define USERDEF_LITERAL_NUM_STRING(NODE) \
1363 (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->num_string)
1364
1365#define USERDEF_LITERAL_TYPE(NODE) \
1366 (TREE_TYPE (USERDEF_LITERAL_VALUE (NODE)))
1367
2d7aa578
ESR
1368extern tree build_userdef_literal (tree suffix_id, tree value,
1369 enum overflow_type overflow,
1370 tree num_string);
3ce4f9e4 1371
f17a223d 1372extern bool convert_vector_to_array_for_subscript (location_t, tree *, tree);
7edaa4d2 1373
a212e43f
MG
1374/* Possibe cases of scalar_to_vector conversion. */
1375enum stv_conv {
688010ba 1376 stv_error, /* Error occurred. */
a212e43f
MG
1377 stv_nothing, /* Nothing happened. */
1378 stv_firstarg, /* First argument must be expanded. */
1379 stv_secondarg /* Second argument must be expanded. */
1380};
1381
1382extern enum stv_conv scalar_to_vector (location_t loc, enum tree_code code,
1383 tree op0, tree op1, bool);
1384
c02065fc 1385/* In c-cilkplus.c */
c02065fc
AH
1386extern tree c_validate_cilk_plus_loop (tree *, int *, void *);
1387extern bool c_check_cilk_loop (location_t, tree);
1388
36536d79
BI
1389/* These #defines allow users to access different operands of the
1390 array notation tree. */
1391
1392#define ARRAY_NOTATION_CHECK(NODE) TREE_CHECK (NODE, ARRAY_NOTATION_REF)
1393#define ARRAY_NOTATION_ARRAY(NODE) \
1394 TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 0)
1395#define ARRAY_NOTATION_START(NODE) \
1396 TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 1)
1397#define ARRAY_NOTATION_LENGTH(NODE) \
1398 TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 2)
1399#define ARRAY_NOTATION_STRIDE(NODE) \
1400 TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 3)
1401
d60f1706
BI
1402/* This structure holds all the scalar values and its appropriate variable
1403 replacment. It is mainly used by the function that pulls all the invariant
1404 parts that should be executed only once, which comes with array notation
1405 expressions. */
1406struct inv_list
1407{
1408 vec<tree, va_gc> *list_values;
1409 vec<tree, va_gc> *replacement;
07a6825b 1410 vec<enum tree_code, va_gc> *additional_tcodes;
d60f1706
BI
1411};
1412
2ce86d2e
BI
1413/* This structure holds all the important components that can be extracted
1414 from an ARRAY_NOTATION_REF expression. It is used to pass array notation
1415 information between the functions that are responsible for expansion. */
1416typedef struct cilkplus_an_parts
1417{
1418 tree value;
1419 tree start;
1420 tree length;
1421 tree stride;
1422 bool is_vector;
1423} an_parts;
1424
1425/* This structure holds the components necessary to create the loop around
1426 the ARRAY_REF that is created using the ARRAY_NOTATION information. */
1427
1428typedef struct cilkplus_an_loop_parts
1429{
1430 tree var; /* Loop induction variable. */
1431 tree incr; /* Loop increment/decrement expression. */
1432 tree cmp; /* Loop condition. */
1433 tree ind_init; /* Initialization of the loop induction variable. */
1434} an_loop_parts;
1435
d60f1706
BI
1436/* In array-notation-common.c. */
1437extern HOST_WIDE_INT extract_sec_implicit_index_arg (location_t, tree);
36536d79
BI
1438extern bool is_sec_implicit_index_fn (tree);
1439extern void array_notation_init_builtins (void);
1440extern struct c_expr fix_array_notation_expr (location_t, enum tree_code,
1441 struct c_expr);
1442extern bool contains_array_notation_expr (tree);
1443extern tree expand_array_notation_exprs (tree);
1444extern tree fix_conditional_array_notations (tree);
1445extern tree find_correct_array_notation_type (tree);
713b46fa 1446extern bool length_mismatch_in_expr_p (location_t, vec<vec<an_parts> >);
d60f1706
BI
1447extern enum built_in_function is_cilkplus_reduce_builtin (tree);
1448extern bool find_rank (location_t, tree, tree, bool, size_t *);
1449extern void extract_array_notation_exprs (tree, bool, vec<tree, va_gc> **);
1450extern void replace_array_notations (tree *, bool, vec<tree, va_gc> *,
1451 vec<tree, va_gc> *);
1452extern tree find_inv_trees (tree *, int *, void *);
1453extern tree replace_inv_trees (tree *, int *, void *);
1454extern tree find_correct_array_notation_type (tree op);
2ce86d2e
BI
1455extern void cilkplus_extract_an_triplets (vec<tree, va_gc> *, size_t, size_t,
1456 vec<vec<an_parts> > *);
1457extern vec <tree, va_gc> *fix_sec_implicit_args
1458 (location_t, vec <tree, va_gc> *, vec<an_loop_parts>, size_t, tree);
fa60eeb9 1459extern bool is_cilkplus_vector_p (tree);
939b37da
BI
1460
1461/* In cilk.c. */
1462extern tree insert_cilk_frame (tree);
1463extern void cilk_init_builtins (void);
12893402
BI
1464extern int gimplify_cilk_spawn (tree *);
1465extern void cilk_install_body_with_frame_cleanup (tree, tree, void *);
939b37da
BI
1466extern bool cilk_detect_spawn_and_unwrap (tree *);
1467extern bool cilk_set_spawn_marker (location_t, tree);
1468extern tree build_cilk_sync (void);
1469extern tree build_cilk_spawn (location_t, tree);
1470extern tree make_cilk_frame (tree);
1471extern tree create_cilk_function_exit (tree, bool, bool);
12893402 1472extern void cilk_outline (tree, tree *, void *);
3af9c5e9 1473extern bool contains_cilk_spawn_stmt (tree);
9a771876 1474extern tree cilk_for_number_of_iterations (tree);
e5e44252
AK
1475extern bool check_no_cilk (tree, const char *, const char *,
1476 location_t loc = UNKNOWN_LOCATION);
1807ffc1 1477extern bool reject_gcc_builtin (const_tree, location_t = UNKNOWN_LOCATION);
e78bede6 1478extern bool valid_array_size_p (location_t, tree, tree);
c3388e62 1479
6bc2bb18
RB
1480extern bool cilk_ignorable_spawn_rhs_op (tree);
1481extern bool cilk_recognize_spawn (tree, tree *);
1482
038b5cc0
MP
1483/* In c-warn.c. */
1484extern void constant_expression_warning (tree);
1485extern void constant_expression_error (tree);
3cd211af 1486extern void overflow_warning (location_t, tree, tree = NULL_TREE);
038b5cc0
MP
1487extern void warn_logical_operator (location_t, enum tree_code, tree,
1488 enum tree_code, tree, enum tree_code, tree);
1489extern void warn_tautological_cmp (location_t, enum tree_code, tree, tree);
1490extern void warn_logical_not_parentheses (location_t, enum tree_code, tree,
1491 tree);
1492extern bool warn_if_unused_value (const_tree, location_t);
1493extern bool strict_aliasing_warning (tree, tree, tree);
1494extern void sizeof_pointer_memaccess_warning (location_t *, tree,
1495 vec<tree, va_gc> *, tree *,
1496 bool (*) (tree, tree));
1497extern void check_main_parameter_types (tree decl);
1498extern void warnings_for_convert_and_check (location_t, tree, tree, tree);
1499extern void c_do_switch_warnings (splay_tree, location_t, tree, tree, bool,
1500 bool);
1501extern void warn_for_omitted_condop (location_t, tree);
4227c9ad 1502extern void warn_for_restrict (unsigned, tree *, unsigned);
038b5cc0
MP
1503
1504/* Places where an lvalue, or modifiable lvalue, may be required.
1505 Used to select diagnostic messages in lvalue_error and
1506 readonly_error. */
1507enum lvalue_use {
1508 lv_assign,
1509 lv_increment,
1510 lv_decrement,
1511 lv_addressof,
1512 lv_asm
1513};
1514
1515extern void lvalue_error (location_t, enum lvalue_use);
1516extern void invalid_indirection_error (location_t, tree, ref_operator);
1517extern void readonly_error (location_t, tree, enum lvalue_use);
1518extern void warn_array_subscript_with_type_char (location_t, tree);
1519extern void warn_about_parentheses (location_t,
1520 enum tree_code,
1521 enum tree_code, tree,
1522 enum tree_code, tree);
1523extern void warn_for_unused_label (tree label);
1524extern void warn_for_div_by_zero (location_t, tree divisor);
1525extern void warn_for_memset (location_t, tree, tree, int);
1526extern void warn_for_sign_compare (location_t,
1527 tree orig_op0, tree orig_op1,
1528 tree op0, tree op1,
1529 tree result_type,
1530 enum tree_code resultcode);
1531extern void do_warn_double_promotion (tree, tree, tree, const char *,
1532 location_t);
1533extern void do_warn_unused_parameter (tree);
1534extern void record_locally_defined_typedef (tree);
1535extern void maybe_record_typedef_use (tree);
1536extern void maybe_warn_unused_local_typedefs (void);
1537extern void maybe_warn_bool_compare (location_t, enum tree_code, tree, tree);
1538extern bool maybe_warn_shift_overflow (location_t, tree, tree);
1539extern void warn_duplicated_cond_add_or_warn (location_t, tree, vec<tree> **);
1540extern bool diagnose_mismatched_attributes (tree, tree);
2ebd93e1 1541extern tree do_warn_duplicated_branches_r (tree *, int *, void *);
3e2becc4
MP
1542extern void warn_for_multistatement_macros (location_t, location_t,
1543 location_t, enum rid);
038b5cc0 1544
b12b1915
MP
1545/* In c-attribs.c. */
1546extern bool attribute_takes_identifier_p (const_tree);
1547extern tree handle_unused_attribute (tree *, tree, tree, int, bool *);
1548extern int parse_tm_stmt_attr (tree, int);
1549extern int tm_attr_to_mask (tree);
1550extern tree tm_mask_to_attr (int);
1551extern tree find_tm_attribute (tree);
1552
56d8ffc1
JG
1553extern enum flt_eval_method
1554excess_precision_mode_join (enum flt_eval_method, enum flt_eval_method);
1555
1556extern int c_flt_eval_method (bool ts18661_p);
45b2222a 1557extern void add_no_sanitize_value (tree node, unsigned int flags);
56d8ffc1 1558
895aa8e1
DM
1559#if CHECKING_P
1560namespace selftest {
b6f43128
DM
1561 /* Declarations for specific families of tests within c-family,
1562 by source file, in alphabetical order. */
895aa8e1 1563 extern void c_format_c_tests (void);
b6f43128
DM
1564
1565 /* The entrypoint for running all of the above tests. */
1566 extern void c_family_tests (void);
895aa8e1
DM
1567} // namespace selftest
1568#endif /* #if CHECKING_P */
1569
88657302 1570#endif /* ! GCC_C_COMMON_H */