]>
Commit | Line | Data |
---|---|---|
40754343 | 1 | /* Definitions for C parsing and type checking. |
3c71940f | 2 | Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, |
ae0ed63a | 3 | 1999, 2000, 2001 Free Software Foundation, Inc. |
40754343 | 4 | |
1322177d | 5 | This file is part of GCC. |
40754343 | 6 | |
1322177d LB |
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. | |
40754343 | 11 | |
1322177d LB |
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. | |
40754343 RS |
16 | |
17 | You should have received a copy of the GNU General Public License | |
1322177d LB |
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. */ | |
40754343 | 21 | |
88657302 RH |
22 | #ifndef GCC_C_TREE_H |
23 | #define GCC_C_TREE_H | |
cf1c49cb | 24 | |
7f4edbcb BS |
25 | #include "c-common.h" |
26 | ||
40754343 RS |
27 | /* Language-dependent contents of an identifier. */ |
28 | ||
ff92a691 JW |
29 | /* The limbo_value is used for block level extern declarations, which need |
30 | to be type checked against subsequent extern declarations. They can't | |
0e5921e8 ZW |
31 | be referenced after they fall out of scope, so they can't be global. |
32 | ||
33 | The rid_code field is used for keywords. It is in all | |
34 | lang_identifier nodes, because some keywords are only special in a | |
35 | particular context. */ | |
ff92a691 | 36 | |
40754343 RS |
37 | struct lang_identifier |
38 | { | |
2a967f3d | 39 | struct c_common_identifier ignore; |
40754343 | 40 | tree global_value, local_value, label_value, implicit_decl; |
f2a02c3a | 41 | tree error_locus, limbo_value; |
40754343 RS |
42 | }; |
43 | ||
1f731749 | 44 | /* Language-specific declaration information. */ |
8f17b5c5 MM |
45 | |
46 | struct lang_decl | |
47 | { | |
48 | struct c_lang_decl base; | |
1f731749 MM |
49 | /* The return types and parameter types may have variable size. |
50 | This is a list of any SAVE_EXPRs that need to be evaluated to | |
51 | compute those sizes. */ | |
52 | tree pending_sizes; | |
8f17b5c5 MM |
53 | }; |
54 | ||
40754343 | 55 | /* Macros for access to language-specific slots in an identifier. */ |
db69cfcb | 56 | /* Each of these slots contains a DECL node or null. */ |
40754343 | 57 | |
db69cfcb RS |
58 | /* This represents the value which the identifier has in the |
59 | file-scope namespace. */ | |
40754343 | 60 | #define IDENTIFIER_GLOBAL_VALUE(NODE) \ |
0f41302f | 61 | (((struct lang_identifier *) (NODE))->global_value) |
db69cfcb RS |
62 | /* This represents the value which the identifier has in the current |
63 | scope. */ | |
40754343 | 64 | #define IDENTIFIER_LOCAL_VALUE(NODE) \ |
0f41302f | 65 | (((struct lang_identifier *) (NODE))->local_value) |
db69cfcb RS |
66 | /* This represents the value which the identifier has as a label in |
67 | the current label scope. */ | |
40754343 | 68 | #define IDENTIFIER_LABEL_VALUE(NODE) \ |
0f41302f | 69 | (((struct lang_identifier *) (NODE))->label_value) |
db69cfcb RS |
70 | /* This records the extern decl of this identifier, if it has had one |
71 | at any point in this compilation. */ | |
f2a02c3a | 72 | #define IDENTIFIER_LIMBO_VALUE(NODE) \ |
0f41302f | 73 | (((struct lang_identifier *) (NODE))->limbo_value) |
db69cfcb RS |
74 | /* This records the implicit function decl of this identifier, if it |
75 | has had one at any point in this compilation. */ | |
40754343 | 76 | #define IDENTIFIER_IMPLICIT_DECL(NODE) \ |
0f41302f | 77 | (((struct lang_identifier *) (NODE))->implicit_decl) |
db69cfcb RS |
78 | /* This is the last function in which we printed an "undefined variable" |
79 | message for this identifier. Value is a FUNCTION_DECL or null. */ | |
40754343 | 80 | #define IDENTIFIER_ERROR_LOCUS(NODE) \ |
0f41302f | 81 | (((struct lang_identifier *) (NODE))->error_locus) |
40754343 RS |
82 | |
83 | /* In identifiers, C uses the following fields in a special way: | |
84 | TREE_PUBLIC to record that there was a previous local extern decl. | |
85 | TREE_USED to record that such a decl was used. | |
86 | TREE_ADDRESSABLE to record that the address of such a decl was used. */ | |
87 | ||
40754343 RS |
88 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ |
89 | #define C_TYPE_FIELDS_READONLY(type) TREE_LANG_FLAG_1 (type) | |
90 | ||
91 | /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile. */ | |
92 | #define C_TYPE_FIELDS_VOLATILE(type) TREE_LANG_FLAG_2 (type) | |
93 | ||
94 | /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE | |
95 | nonzero if the definition of the type has already started. */ | |
96 | #define C_TYPE_BEING_DEFINED(type) TYPE_LANG_FLAG_0 (type) | |
97 | ||
0e5921e8 ZW |
98 | /* In an IDENTIFIER_NODE, nonzero if this identifier is actually a |
99 | keyword. C_RID_CODE (node) is then the RID_* value of the keyword, | |
100 | and C_RID_YYCODE is the token number wanted by Yacc. */ | |
101 | ||
102 | #define C_IS_RESERVED_WORD(id) TREE_LANG_FLAG_0 (id) | |
0e5921e8 | 103 | |
40754343 RS |
104 | /* In a RECORD_TYPE, a sorted array of the fields of the type. */ |
105 | struct lang_type | |
106 | { | |
107 | int len; | |
108 | tree elts[1]; | |
109 | }; | |
110 | ||
40754343 RS |
111 | /* Record whether a type or decl was written with nonconstant size. |
112 | Note that TYPE_SIZE may have simplified to a constant. */ | |
113 | #define C_TYPE_VARIABLE_SIZE(type) TYPE_LANG_FLAG_1 (type) | |
114 | #define C_DECL_VARIABLE_SIZE(type) DECL_LANG_FLAG_0 (type) | |
115 | ||
40754343 RS |
116 | #if 0 /* Not used. */ |
117 | /* Record whether a decl for a function or function pointer has | |
118 | already been mentioned (in a warning) because it was called | |
119 | but didn't have a prototype. */ | |
120 | #define C_MISSING_PROTOTYPE_WARNED(decl) DECL_LANG_FLAG_2(decl) | |
121 | #endif | |
122 | ||
123 | /* Store a value in that field. */ | |
124 | #define C_SET_EXP_ORIGINAL_CODE(exp, code) \ | |
0f41302f | 125 | (TREE_COMPLEXITY (exp) = (int) (code)) |
40754343 RS |
126 | |
127 | /* Record whether a typedef for type `int' was actually `signed int'. */ | |
128 | #define C_TYPEDEF_EXPLICITLY_SIGNED(exp) DECL_LANG_FLAG_1 ((exp)) | |
129 | ||
96735c06 RS |
130 | /* Nonzero for a declaration of a built in function if there has been no |
131 | occasion that would declare the function in ordinary C. | |
132 | Using the function draws a pedantic warning in this case. */ | |
133 | #define C_DECL_ANTICIPATED(exp) DECL_LANG_FLAG_3 ((exp)) | |
134 | ||
40754343 RS |
135 | /* For FUNCTION_TYPE, a hidden list of types of arguments. The same as |
136 | TYPE_ARG_TYPES for functions with prototypes, but created for functions | |
137 | without prototypes. */ | |
138 | #define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_NONCOPIED_PARTS (NODE) | |
4e28fa00 | 139 | |
40754343 | 140 | \f |
bfb73556 | 141 | /* in c-lang.c and objc-act.c */ |
6e090c76 KG |
142 | extern tree lookup_interface PARAMS ((tree)); |
143 | extern tree is_class_name PARAMS ((tree)); | |
144 | extern void maybe_objc_check_decl PARAMS ((tree)); | |
145 | extern void finish_file PARAMS ((void)); | |
146 | extern int maybe_objc_comptypes PARAMS ((tree, tree, int)); | |
147 | extern tree maybe_building_objc_message_expr PARAMS ((void)); | |
6e090c76 | 148 | extern int recognize_objc_keyword PARAMS ((void)); |
7e585d16 | 149 | extern tree lookup_objc_ivar PARAMS ((tree)); |
7c57c798 | 150 | \f |
1526a060 | 151 | /* in c-parse.in */ |
6e090c76 | 152 | extern void c_parse_init PARAMS ((void)); |
3aac38d7 | 153 | extern int yyparse_1 PARAMS ((void)); |
1526a060 | 154 | |
7c57c798 | 155 | /* in c-aux-info.c */ |
6e090c76 | 156 | extern void gen_aux_info_record PARAMS ((tree, int, int, int)); |
40754343 | 157 | |
7c57c798 | 158 | /* in c-decl.c */ |
0e03329a | 159 | extern tree build_array_declarator PARAMS ((tree, tree, int, int)); |
6e090c76 | 160 | extern tree build_enumerator PARAMS ((tree, tree)); |
50e60bc3 | 161 | |
3932261a MM |
162 | #define c_build_type_variant(TYPE, CONST_P, VOLATILE_P) \ |
163 | c_build_qualified_type (TYPE, \ | |
164 | ((CONST_P) ? TYPE_QUAL_CONST : 0) | \ | |
165 | ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0)) | |
6e090c76 KG |
166 | extern int c_decode_option PARAMS ((int, char **)); |
167 | extern void c_mark_varargs PARAMS ((void)); | |
77c4d6c0 | 168 | extern void check_for_loop_decls PARAMS ((void)); |
6e090c76 KG |
169 | extern tree check_identifier PARAMS ((tree, tree)); |
170 | extern void clear_parm_order PARAMS ((void)); | |
6e090c76 KG |
171 | extern int complete_array_type PARAMS ((tree, tree, int)); |
172 | extern void declare_parm_level PARAMS ((int)); | |
3b304f5b ZW |
173 | extern tree define_label PARAMS ((const char *, int, |
174 | tree)); | |
6e090c76 KG |
175 | extern void delete_block PARAMS ((tree)); |
176 | extern void finish_decl PARAMS ((tree, tree, tree)); | |
177 | extern void finish_decl_top_level PARAMS ((tree, tree, tree)); | |
178 | extern tree finish_enum PARAMS ((tree, tree, tree)); | |
179 | extern void finish_function PARAMS ((int)); | |
180 | extern tree finish_struct PARAMS ((tree, tree, tree)); | |
181 | extern tree get_parm_info PARAMS ((int)); | |
6e090c76 KG |
182 | extern tree grokfield PARAMS ((const char *, int, tree, tree, tree)); |
183 | extern tree groktypename PARAMS ((tree)); | |
184 | extern tree groktypename_in_parm_context PARAMS ((tree)); | |
185 | extern tree implicitly_declare PARAMS ((tree)); | |
111458f1 | 186 | extern void implicit_decl_warning PARAMS ((tree)); |
6e090c76 | 187 | extern int in_parm_level_p PARAMS ((void)); |
6e090c76 KG |
188 | extern void keep_next_level PARAMS ((void)); |
189 | extern int kept_level_p PARAMS ((void)); | |
6e090c76 KG |
190 | extern tree lookup_name PARAMS ((tree)); |
191 | extern tree lookup_name_current_level PARAMS ((tree)); | |
192 | extern tree lookup_name_current_level_global PARAMS ((tree)); | |
6e090c76 KG |
193 | extern void parmlist_tags_warning PARAMS ((void)); |
194 | extern void pending_xref_error PARAMS ((void)); | |
195 | extern void mark_c_function_context PARAMS ((struct function *)); | |
196 | extern void push_c_function_context PARAMS ((struct function *)); | |
197 | extern void pop_c_function_context PARAMS ((struct function *)); | |
198 | extern void pop_label_level PARAMS ((void)); | |
6e090c76 KG |
199 | extern void push_label_level PARAMS ((void)); |
200 | extern void push_parm_decl PARAMS ((tree)); | |
6e090c76 | 201 | extern tree pushdecl_top_level PARAMS ((tree)); |
6e090c76 | 202 | extern void pushtag PARAMS ((tree, tree)); |
0e03329a | 203 | extern tree set_array_declarator_type PARAMS ((tree, tree, int)); |
6e090c76 KG |
204 | extern tree shadow_label PARAMS ((tree)); |
205 | extern void shadow_record_fields PARAMS ((tree)); | |
206 | extern void shadow_tag PARAMS ((tree)); | |
207 | extern void shadow_tag_warned PARAMS ((tree, int)); | |
208 | extern tree start_enum PARAMS ((tree)); | |
f7a4cec0 | 209 | extern int start_function PARAMS ((tree, tree, tree)); |
6e090c76 | 210 | extern tree start_decl PARAMS ((tree, tree, int, |
f7a4cec0 | 211 | tree)); |
6e090c76 KG |
212 | extern tree start_struct PARAMS ((enum tree_code, tree)); |
213 | extern void store_parm_decls PARAMS ((void)); | |
214 | extern tree xref_tag PARAMS ((enum tree_code, tree)); | |
8f17b5c5 MM |
215 | extern tree c_begin_compound_stmt PARAMS ((void)); |
216 | extern void c_expand_decl_stmt PARAMS ((tree)); | |
7c57c798 RS |
217 | |
218 | /* in c-typeck.c */ | |
6e090c76 | 219 | extern tree require_complete_type PARAMS ((tree)); |
6e090c76 KG |
220 | extern int comptypes PARAMS ((tree, tree)); |
221 | extern tree c_sizeof PARAMS ((tree)); | |
222 | extern tree c_sizeof_nowarn PARAMS ((tree)); | |
223 | extern tree c_size_in_bytes PARAMS ((tree)); | |
224 | extern tree c_alignof PARAMS ((tree)); | |
225 | extern tree c_alignof_expr PARAMS ((tree)); | |
6e090c76 KG |
226 | extern tree build_component_ref PARAMS ((tree, tree)); |
227 | extern tree build_indirect_ref PARAMS ((tree, const char *)); | |
228 | extern tree build_array_ref PARAMS ((tree, tree)); | |
7e585d16 | 229 | extern tree build_external_ref PARAMS ((tree, int)); |
6e090c76 KG |
230 | extern tree parser_build_binary_op PARAMS ((enum tree_code, |
231 | tree, tree)); | |
6e090c76 | 232 | extern void readonly_warning PARAMS ((tree, const char *)); |
6e090c76 KG |
233 | extern tree build_conditional_expr PARAMS ((tree, tree, tree)); |
234 | extern tree build_compound_expr PARAMS ((tree)); | |
15b732b2 NB |
235 | extern tree c_cast_expr PARAMS ((tree, tree)); |
236 | extern tree build_c_cast PARAMS ((tree, tree)); | |
6e090c76 KG |
237 | extern tree build_modify_expr PARAMS ((tree, enum tree_code, |
238 | tree)); | |
239 | extern void store_init_value PARAMS ((tree, tree)); | |
240 | extern void error_init PARAMS ((const char *)); | |
241 | extern void pedwarn_init PARAMS ((const char *)); | |
242 | extern void start_init PARAMS ((tree, tree, int)); | |
243 | extern void finish_init PARAMS ((void)); | |
244 | extern void really_start_incremental_init PARAMS ((tree)); | |
245 | extern void push_init_level PARAMS ((int)); | |
246 | extern tree pop_init_level PARAMS ((int)); | |
247 | extern void set_init_index PARAMS ((tree, tree)); | |
248 | extern void set_init_label PARAMS ((tree)); | |
249 | extern void process_init_element PARAMS ((tree)); | |
903f51d9 RH |
250 | extern void pedwarn_c99 PARAMS ((const char *, ...)) |
251 | ATTRIBUTE_PRINTF_1; | |
8f17b5c5 MM |
252 | extern tree c_start_case PARAMS ((tree)); |
253 | extern void c_finish_case PARAMS ((void)); | |
15b732b2 | 254 | extern tree simple_asm_stmt PARAMS ((tree)); |
64094f6a RH |
255 | extern tree build_asm_stmt PARAMS ((tree, tree, tree, |
256 | tree, tree)); | |
40754343 RS |
257 | |
258 | /* Set to 0 at beginning of a function definition, set to 1 if | |
259 | a return statement that specifies a return value is seen. */ | |
260 | ||
261 | extern int current_function_returns_value; | |
262 | ||
263 | /* Set to 0 at beginning of a function definition, set to 1 if | |
264 | a return statement with no argument is seen. */ | |
265 | ||
266 | extern int current_function_returns_null; | |
267 | ||
6bdd692c RK |
268 | /* Nonzero means the expression being parsed will never be evaluated. |
269 | This is a count, since unevaluated expressions can nest. */ | |
270 | ||
271 | extern int skip_evaluation; | |
272 | ||
40754343 RS |
273 | /* Nonzero means `$' can be in an identifier. */ |
274 | ||
275 | extern int dollars_in_ident; | |
276 | ||
277 | /* Nonzero means allow type mismatches in conditional expressions; | |
278 | just make their values `void'. */ | |
279 | ||
280 | extern int flag_cond_mismatch; | |
281 | ||
282 | /* Nonzero means don't recognize the keyword `asm'. */ | |
283 | ||
284 | extern int flag_no_asm; | |
285 | ||
40754343 RS |
286 | /* Nonzero means warn about implicit declarations. */ |
287 | ||
288 | extern int warn_implicit; | |
289 | ||
40754343 RS |
290 | /* Nonzero means warn about sizeof (function) or addition/subtraction |
291 | of function pointers. */ | |
292 | ||
293 | extern int warn_pointer_arith; | |
294 | ||
295 | /* Nonzero means warn for all old-style non-prototype function decls. */ | |
296 | ||
297 | extern int warn_strict_prototypes; | |
298 | ||
299 | /* Nonzero means warn about multiple (redundant) decls for the same single | |
300 | variable or function. */ | |
301 | ||
302 | extern int warn_redundant_decls; | |
303 | ||
304 | /* Nonzero means warn about extern declarations of objects not at | |
305 | file-scope level and about *all* declarations of functions (whether | |
306 | extern or static) not at file-scope level. Note that we exclude | |
307 | implicit function declarations. To get warnings about those, use | |
308 | -Wimplicit. */ | |
309 | ||
310 | extern int warn_nested_externs; | |
311 | ||
312 | /* Nonzero means warn about pointer casts that can drop a type qualifier | |
313 | from the pointer target type. */ | |
314 | ||
315 | extern int warn_cast_qual; | |
316 | ||
95572adf RK |
317 | /* Nonzero means warn when casting a function call to a type that does |
318 | not match the return type (e.g. (float)sqrt() or (anything*)malloc() | |
319 | when there is no previous declaration of sqrt or malloc. */ | |
320 | ||
321 | extern int warn_bad_function_cast; | |
322 | ||
40754343 RS |
323 | /* Warn about traditional constructs whose meanings changed in ANSI C. */ |
324 | ||
325 | extern int warn_traditional; | |
326 | ||
40754343 RS |
327 | /* Warn about a subscript that has type char. */ |
328 | ||
329 | extern int warn_char_subscripts; | |
330 | ||
92fce8f5 RK |
331 | /* Warn if main is suspicious. */ |
332 | ||
333 | extern int warn_main; | |
334 | ||
b3fe11b8 RS |
335 | /* Nonzero means to allow single precision math even if we're generally |
336 | being traditional. */ | |
337 | extern int flag_allow_single_precision; | |
338 | ||
83091176 RS |
339 | /* Warn if initializer is not completely bracketed. */ |
340 | ||
341 | extern int warn_missing_braces; | |
342 | ||
d51f9363 JM |
343 | /* Warn about comparison of signed and unsigned values. */ |
344 | ||
ab684785 | 345 | extern int warn_sign_compare; |
d51f9363 | 346 | |
b843d210 DZ |
347 | /* Warn about testing equality of floating point numbers. */ |
348 | ||
349 | extern int warn_float_equal; | |
350 | ||
4a870dba JM |
351 | /* Warn about multicharacter constants. */ |
352 | ||
353 | extern int warn_multichar; | |
354 | ||
40754343 RS |
355 | /* Nonzero means we are reading code that came from a system header file. */ |
356 | ||
357 | extern int system_header_p; | |
7c57c798 | 358 | |
111458f1 ZW |
359 | /* Warn about implicit declarations. 1 = warning, 2 = error. */ |
360 | extern int mesg_implicit_function_declaration; | |
361 | ||
0bb0a00b | 362 | /* In c-decl.c */ |
6e090c76 | 363 | extern void finish_incomplete_decl PARAMS ((tree)); |
0bb0a00b | 364 | |
88657302 | 365 | #endif /* ! GCC_C_TREE_H */ |