]>
Commit | Line | Data |
---|---|---|
907a24a1 | 1 | /* Definitions for C parsing and type checking. |
ca628a86 | 2 | Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, |
0364c2b4 | 3 | 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. |
907a24a1 | 4 | |
f12b58b3 | 5 | This file is part of GCC. |
907a24a1 | 6 | |
f12b58b3 | 7 | GCC is free software; you can redistribute it and/or modify it under |
8 | the terms of the GNU General Public License as published by the Free | |
9 | Software Foundation; either version 2, or (at your option) any later | |
10 | version. | |
907a24a1 | 11 | |
f12b58b3 | 12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | for more details. | |
907a24a1 | 16 | |
17 | You should have received a copy of the GNU General Public License | |
f12b58b3 | 18 | along with GCC; see the file COPYING. If not, write to the Free |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
20 | 02111-1307, USA. */ | |
907a24a1 | 21 | |
2a281353 | 22 | #ifndef GCC_C_TREE_H |
23 | #define GCC_C_TREE_H | |
7ba2cd99 | 24 | |
72040e7e | 25 | #include "c-common.h" |
26 | ||
56533c31 | 27 | /* struct lang_identifier is private to c-decl.c, but langhooks.c needs to |
28 | know how big it is. This is sanity-checked in c-decl.c. */ | |
29 | #define C_SIZEOF_STRUCT_LANG_IDENTIFIER \ | |
30 | (sizeof (struct c_common_identifier) + 3 * sizeof (void *)) | |
907a24a1 | 31 | |
4ee9c684 | 32 | /* For gc purposes, return the most likely link for the longest chain. */ |
33 | #define C_LANG_TREE_NODE_CHAIN_NEXT(T) \ | |
34 | ((union lang_tree_node *) \ | |
35 | (TREE_CODE (T) == INTEGER_TYPE ? TYPE_NEXT_VARIANT (T) \ | |
36 | : TREE_CODE (T) == COMPOUND_EXPR ? TREE_OPERAND (T, 1) \ | |
37 | : TREE_CHAIN (T))) | |
38 | ||
ce467a73 | 39 | /* Language-specific declaration information. */ |
e41f0d80 | 40 | |
1f3233d1 | 41 | struct lang_decl GTY(()) |
e41f0d80 | 42 | { |
ce467a73 | 43 | /* The return types and parameter types may have variable size. |
44 | This is a list of any SAVE_EXPRs that need to be evaluated to | |
45 | compute those sizes. */ | |
46 | tree pending_sizes; | |
e41f0d80 | 47 | }; |
48 | ||
907a24a1 | 49 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ |
163d43d8 | 50 | #define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE) |
907a24a1 | 51 | |
52 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile. */ | |
163d43d8 | 53 | #define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE) |
907a24a1 | 54 | |
55 | /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE | |
56 | nonzero if the definition of the type has already started. */ | |
163d43d8 | 57 | #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE) |
3e0a85c2 | 58 | |
59 | /* In an incomplete RECORD_TYPE or UNION_TYPE, a list of variable | |
60 | declarations whose type would be completed by completing that type. */ | |
61 | #define C_TYPE_INCOMPLETE_VARS(TYPE) TYPE_VFIELD (TYPE) | |
907a24a1 | 62 | |
518796ad | 63 | /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a |
64 | keyword. C_RID_CODE (node) is then the RID_* value of the keyword, | |
65 | and C_RID_YYCODE is the token number wanted by Yacc. */ | |
163d43d8 | 66 | #define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID) |
518796ad | 67 | |
1f3233d1 | 68 | struct lang_type GTY(()) |
907a24a1 | 69 | { |
4ee9c684 | 70 | /* In a RECORD_TYPE, a sorted array of the fields of the type. */ |
d9cf68bf | 71 | struct sorted_fields_type * GTY ((reorder ("resort_sorted_fields"))) s; |
4ee9c684 | 72 | /* In an ENUMERAL_TYPE, the min and max values. */ |
73 | tree enum_min; | |
74 | tree enum_max; | |
907a24a1 | 75 | }; |
76 | ||
907a24a1 | 77 | /* Record whether a type or decl was written with nonconstant size. |
78 | Note that TYPE_SIZE may have simplified to a constant. */ | |
163d43d8 | 79 | #define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE) |
80 | #define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE) | |
907a24a1 | 81 | |
907a24a1 | 82 | /* Store a value in that field. */ |
163d43d8 | 83 | #define C_SET_EXP_ORIGINAL_CODE(EXP, CODE) \ |
84 | (TREE_COMPLEXITY (EXP) = (int) (CODE)) | |
907a24a1 | 85 | |
86 | /* Record whether a typedef for type `int' was actually `signed int'. */ | |
163d43d8 | 87 | #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP) |
907a24a1 | 88 | |
af857942 | 89 | /* For a FUNCTION_DECL, nonzero if it was defined without an explicit |
90 | return type. */ | |
91 | #define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP) | |
92 | ||
31ddae9f | 93 | /* For a FUNCTION_DECL, nonzero if it was an implicit declaration. */ |
94 | #define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP) | |
95 | ||
393b349a | 96 | /* For any decl, nonzero if it is bound in the externals scope and |
97 | pop_scope mustn't chain it into any higher block. */ | |
98 | #define C_DECL_IN_EXTERNAL_SCOPE(EXP) DECL_LANG_FLAG_3 (EXP) | |
99 | ||
100 | /* For FUNCTION_DECLs, evaluates true if the decl is built-in but has | |
101 | been declared. */ | |
102 | #define C_DECL_DECLARED_BUILTIN(EXP) DECL_LANG_FLAG_4 (EXP) | |
31ddae9f | 103 | |
7746224a | 104 | /* Record whether a decl was declared register. This is strictly a |
105 | front-end flag, whereas DECL_REGISTER is used for code generation; | |
106 | they may differ for structures with volatile fields. */ | |
107 | #define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_5 (EXP) | |
108 | ||
31ddae9f | 109 | /* Nonzero for a decl which either doesn't exist or isn't a prototype. |
110 | N.B. Could be simplified if all built-in decls had complete prototypes | |
111 | (but this is presently difficult because some of them need FILE*). */ | |
112 | #define C_DECL_ISNT_PROTOTYPE(EXP) \ | |
113 | (EXP == 0 \ | |
114 | || (TYPE_ARG_TYPES (TREE_TYPE (EXP)) == 0 \ | |
115 | && !DECL_BUILT_IN (EXP))) | |
20f91811 | 116 | |
907a24a1 | 117 | /* For FUNCTION_TYPE, a hidden list of types of arguments. The same as |
118 | TYPE_ARG_TYPES for functions with prototypes, but created for functions | |
119 | without prototypes. */ | |
8cbe13ee | 120 | #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_BINFO (NODE) |
ad9afbbd | 121 | |
d9cf68bf | 122 | /* Save and restore the variables in this file and elsewhere |
123 | that keep track of the progress of compilation of the current function. | |
124 | Used for nested functions. */ | |
125 | ||
126 | struct language_function GTY(()) | |
127 | { | |
128 | struct c_language_function base; | |
129 | int returns_value; | |
130 | int returns_null; | |
131 | int returns_abnormally; | |
132 | int warn_about_return_type; | |
133 | int extern_inline; | |
134 | int x_in_iteration_stmt; | |
135 | int x_in_case_stmt; | |
136 | }; | |
137 | ||
96526206 | 138 | \f |
dc12af01 | 139 | /* in c-parse.in */ |
2b30d46c | 140 | extern void c_parse_init (void); |
dc12af01 | 141 | |
96526206 | 142 | /* in c-aux-info.c */ |
2b30d46c | 143 | extern void gen_aux_info_record (tree, int, int, int); |
907a24a1 | 144 | |
96526206 | 145 | /* in c-decl.c */ |
2bbf1d92 | 146 | extern int c_in_iteration_stmt; |
147 | extern int c_in_case_stmt; | |
148 | ||
2b30d46c | 149 | extern int global_bindings_p (void); |
2b30d46c | 150 | extern tree getdecls (void); |
393b349a | 151 | extern void push_scope (void); |
152 | extern tree pop_scope (void); | |
2b30d46c | 153 | extern void insert_block (tree); |
2b30d46c | 154 | extern tree pushdecl (tree); |
c17b85ea | 155 | extern void c_expand_body (tree); |
2b30d46c | 156 | |
2b30d46c | 157 | extern void c_init_decl_processing (void); |
158 | extern void c_dup_lang_specific_decl (tree); | |
159 | extern void c_print_identifier (FILE *, tree, int); | |
160 | extern tree build_array_declarator (tree, tree, int, int); | |
161 | extern tree build_enumerator (tree, tree); | |
162 | extern void check_for_loop_decls (void); | |
f74be9a1 | 163 | extern void mark_forward_parm_decls (void); |
2b30d46c | 164 | extern int complete_array_type (tree, tree, int); |
2b652cf3 | 165 | extern void declare_parm_level (void); |
a0c21e2b | 166 | extern void undeclared_variable (tree); |
bdc33d98 | 167 | extern tree declare_label (tree); |
92ddaf90 | 168 | extern tree define_label (location_t, tree); |
2b30d46c | 169 | extern void finish_decl (tree, tree, tree); |
170 | extern tree finish_enum (tree, tree, tree); | |
2ff66ee0 | 171 | extern void finish_function (void); |
2b30d46c | 172 | extern tree finish_struct (tree, tree, tree); |
393b349a | 173 | extern tree get_parm_info (bool); |
4862d777 | 174 | extern tree grokfield (tree, tree, tree); |
2b30d46c | 175 | extern tree groktypename (tree); |
176 | extern tree groktypename_in_parm_context (tree); | |
177 | extern tree implicitly_declare (tree); | |
2b30d46c | 178 | extern void keep_next_level (void); |
179 | extern tree lookup_name (tree); | |
2b30d46c | 180 | extern void pending_xref_error (void); |
181 | extern void c_push_function_context (struct function *); | |
182 | extern void c_pop_function_context (struct function *); | |
2b30d46c | 183 | extern void push_parm_decl (tree); |
184 | extern tree pushdecl_top_level (tree); | |
2b30d46c | 185 | extern tree set_array_declarator_type (tree, tree, int); |
2b30d46c | 186 | extern void shadow_tag (tree); |
187 | extern void shadow_tag_warned (tree, int); | |
188 | extern tree start_enum (tree); | |
189 | extern int start_function (tree, tree, tree); | |
190 | extern tree start_decl (tree, tree, int, tree); | |
191 | extern tree start_struct (enum tree_code, tree); | |
192 | extern void store_parm_decls (void); | |
193 | extern tree xref_tag (enum tree_code, tree); | |
2363ef00 | 194 | extern int c_expand_decl (tree); |
43085570 | 195 | extern void c_static_assembler_name (tree); |
2b30d46c | 196 | extern tree make_pointer_declarator (tree, tree); |
aaa4d7e7 | 197 | |
198 | /* in c-objc-common.c */ | |
2b30d46c | 199 | extern int c_disregard_inline_limits (tree); |
200 | extern int c_cannot_inline_tree_fn (tree *); | |
201 | extern bool c_objc_common_init (void); | |
4ee9c684 | 202 | extern bool c_missing_noreturn_ok_p (tree); |
d1b92730 | 203 | extern tree c_objc_common_truthvalue_conversion (tree expr); |
2b30d46c | 204 | extern void c_objc_common_finish_file (void); |
205 | extern int defer_fn (tree); | |
206 | extern bool c_warn_unused_global_decl (tree); | |
aaa4d7e7 | 207 | |
208 | #define c_build_type_variant(TYPE, CONST_P, VOLATILE_P) \ | |
209 | c_build_qualified_type ((TYPE), \ | |
210 | ((CONST_P) ? TYPE_QUAL_CONST : 0) | \ | |
211 | ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0)) | |
212 | ||
d3a4d008 | 213 | #define c_sizeof_nowarn(T) c_sizeof_or_alignof_type (T, SIZEOF_EXPR, 0) |
40109983 | 214 | |
96526206 | 215 | /* in c-typeck.c */ |
40109983 | 216 | |
2b30d46c | 217 | extern tree require_complete_type (tree); |
393b349a | 218 | extern int same_translation_unit_p (tree, tree); |
3ed275a6 | 219 | extern int comptypes (tree, tree); |
2b30d46c | 220 | extern tree c_size_in_bytes (tree); |
221 | extern bool c_mark_addressable (tree); | |
222 | extern void c_incomplete_type_error (tree, tree); | |
223 | extern tree c_type_promotes_to (tree); | |
1ea7fa60 | 224 | extern tree composite_type (tree, tree); |
2b30d46c | 225 | extern tree build_component_ref (tree, tree); |
226 | extern tree build_indirect_ref (tree, const char *); | |
227 | extern tree build_array_ref (tree, tree); | |
228 | extern tree build_external_ref (tree, int); | |
229 | extern tree parser_build_binary_op (enum tree_code, tree, tree); | |
230 | extern int c_tree_expr_nonnegative_p (tree); | |
9d5baf96 | 231 | extern void readonly_error (tree, const char *); |
2b30d46c | 232 | extern tree build_conditional_expr (tree, tree, tree); |
233 | extern tree build_compound_expr (tree); | |
234 | extern tree c_cast_expr (tree, tree); | |
235 | extern tree build_c_cast (tree, tree); | |
236 | extern tree build_modify_expr (tree, enum tree_code, tree); | |
237 | extern void store_init_value (tree, tree); | |
238 | extern void error_init (const char *); | |
239 | extern void pedwarn_init (const char *); | |
240 | extern void start_init (tree, tree, int); | |
241 | extern void finish_init (void); | |
242 | extern void really_start_incremental_init (tree); | |
243 | extern void push_init_level (int); | |
244 | extern tree pop_init_level (int); | |
245 | extern void set_init_index (tree, tree); | |
246 | extern void set_init_label (tree); | |
247 | extern void process_init_element (tree); | |
248 | extern tree build_compound_literal (tree, tree); | |
aa267cf6 | 249 | extern void pedwarn_c90 (const char *, ...) ATTRIBUTE_PRINTF_1; |
2b30d46c | 250 | extern void pedwarn_c99 (const char *, ...) ATTRIBUTE_PRINTF_1; |
251 | extern tree c_start_case (tree); | |
2363ef00 | 252 | extern void c_finish_case (tree); |
fae5a040 | 253 | extern tree build_asm_expr (tree, tree, tree, tree, bool); |
254 | extern tree build_asm_stmt (tree, tree); | |
f0c467da | 255 | extern tree c_convert_parm_for_inlining (tree, tree, tree, int); |
4ee9c684 | 256 | extern int c_types_compatible_p (tree, tree); |
2363ef00 | 257 | extern tree c_begin_compound_stmt (bool); |
258 | extern tree c_end_compound_stmt (tree, bool); | |
259 | extern void c_expand_start_cond (tree, int, tree); | |
260 | extern void c_finish_then (tree); | |
261 | extern void c_expand_start_else (void); | |
262 | extern void c_finish_else (tree); | |
263 | extern void c_expand_end_cond (void); | |
264 | extern tree c_begin_if_stmt (void); | |
265 | extern tree c_begin_while_stmt (void); | |
266 | extern void c_finish_while_stmt_cond (tree, tree); | |
267 | extern void c_finish_while_stmt (tree, tree); | |
268 | extern tree c_begin_for_stmt (void); | |
269 | extern void c_finish_for_stmt_init (tree); | |
270 | extern void c_finish_for_stmt_cond (tree, tree); | |
271 | extern void c_finish_for_stmt_incr (tree, tree); | |
272 | extern void c_finish_for_stmt (tree, tree); | |
273 | extern tree c_begin_stmt_expr (void); | |
274 | extern tree c_finish_stmt_expr (tree); | |
43bf5d72 | 275 | extern tree build_offsetof (tree, tree); |
907a24a1 | 276 | |
277 | /* Set to 0 at beginning of a function definition, set to 1 if | |
278 | a return statement that specifies a return value is seen. */ | |
279 | ||
280 | extern int current_function_returns_value; | |
281 | ||
282 | /* Set to 0 at beginning of a function definition, set to 1 if | |
283 | a return statement with no argument is seen. */ | |
284 | ||
285 | extern int current_function_returns_null; | |
286 | ||
af857942 | 287 | /* Set to 0 at beginning of a function definition, set to 1 if |
288 | a call to a noreturn function is seen. */ | |
289 | ||
290 | extern int current_function_returns_abnormally; | |
291 | ||
907a24a1 | 292 | /* Nonzero means we are reading code that came from a system header file. */ |
293 | ||
294 | extern int system_header_p; | |
96526206 | 295 | |
393b349a | 296 | /* True means global_bindings_p should return false even if the scope stack |
297 | says we are in file scope. */ | |
298 | ||
299 | extern bool c_override_global_bindings_to_false; | |
300 | ||
eea57b92 | 301 | /* In c-decl.c */ |
2b30d46c | 302 | extern void c_finish_incomplete_decl (tree); |
c17b85ea | 303 | extern void *get_current_scope (void); |
304 | extern void objc_mark_locals_volatile (void *); | |
40109983 | 305 | extern void c_write_global_declarations (void); |
eea57b92 | 306 | |
1f3233d1 | 307 | extern GTY(()) tree static_ctors; |
308 | extern GTY(()) tree static_dtors; | |
4cfbaf39 | 309 | |
69579044 | 310 | /* In order for the format checking to accept the C frontend |
311 | diagnostic framework extensions, you must include this file before | |
312 | toplev.h, not after. */ | |
313 | #define GCC_DIAG_STYLE __gcc_cdiag__ | |
314 | ||
2a281353 | 315 | #endif /* ! GCC_C_TREE_H */ |