]>
Commit | Line | Data |
---|---|---|
66ea6f4c | 1 | /* YACC parser for C syntax and for Objective C. -*-c-*- |
f560bf91 JM |
2 | Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, |
3 | 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | |
028299c6 | 4 | |
1322177d | 5 | This file is part of GCC. |
028299c6 | 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. | |
028299c6 | 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. | |
028299c6 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. */ | |
028299c6 RS |
21 | |
22 | /* This file defines the grammar of C and that of Objective C. | |
264fa2db ZL |
23 | @@ifobjc ... @@end_ifobjc conditionals contain code for Objective C only. |
24 | @@ifc ... @@end_ifc conditionals contain code for C only. | |
66b2ba11 | 25 | Sed commands in Makefile.in are used to convert this file into |
028299c6 RS |
26 | c-parse.y and into objc-parse.y. */ |
27 | ||
28 | /* To whomever it may concern: I have heard that such a thing was once | |
41ddaaa4 | 29 | written by AT&T, but I have never seen it. */ |
028299c6 | 30 | |
264fa2db | 31 | @@ifc |
f2e6e530 | 32 | %expect 10 /* shift/reduce conflicts, and no reduce/reduce conflicts. */ |
264fa2db | 33 | @@end_ifc |
028299c6 RS |
34 | |
35 | %{ | |
818e50a5 | 36 | #include "config.h" |
944fc8ab | 37 | #include "system.h" |
4977bab6 ZW |
38 | #include "coretypes.h" |
39 | #include "tm.h" | |
028299c6 | 40 | #include "tree.h" |
e57e265b | 41 | #include "langhooks.h" |
028299c6 | 42 | #include "input.h" |
8b97c5f8 ZW |
43 | #include "cpplib.h" |
44 | #include "intl.h" | |
45 | #include "timevar.h" | |
81a75f0f | 46 | #include "c-pragma.h" /* For YYDEBUG definition, and parse_in. */ |
028299c6 RS |
47 | #include "c-tree.h" |
48 | #include "flags.h" | |
17211ab5 | 49 | #include "varray.h" |
990ac8d7 | 50 | #include "output.h" |
5f6da302 | 51 | #include "toplev.h" |
1526a060 | 52 | #include "ggc.h" |
84d901be | 53 | |
264fa2db | 54 | @@ifobjc |
df24d0da | 55 | #include "objc-act.h" |
264fa2db | 56 | @@end_ifobjc |
028299c6 | 57 | |
028299c6 RS |
58 | /* Like YYERROR but do call yyerror. */ |
59 | #define YYERROR1 { yyerror ("syntax error"); YYERROR; } | |
94a50397 RH |
60 | |
61 | /* Like the default stack expander, except (1) use realloc when possible, | |
62 | (2) impose no hard maxiumum on stack size, (3) REALLY do not use alloca. | |
63 | ||
64 | Irritatingly, YYSTYPE is defined after this %{ %} block, so we cannot | |
65 | give malloced_yyvs its proper type. This is ok since all we need from | |
66 | it is to be able to free it. */ | |
67 | ||
68 | static short *malloced_yyss; | |
69 | static void *malloced_yyvs; | |
70 | ||
71 | #define yyoverflow(MSG, SS, SSSIZE, VS, VSSIZE, YYSSZ) \ | |
72 | do { \ | |
73 | size_t newsize; \ | |
74 | short *newss; \ | |
75 | YYSTYPE *newvs; \ | |
76 | newsize = *(YYSSZ) *= 2; \ | |
77 | if (malloced_yyss) \ | |
78 | { \ | |
703ad42b KG |
79 | newss = really_call_realloc (*(SS), newsize * sizeof (short)); \ |
80 | newvs = really_call_realloc (*(VS), newsize * sizeof (YYSTYPE)); \ | |
94a50397 RH |
81 | } \ |
82 | else \ | |
83 | { \ | |
703ad42b KG |
84 | newss = really_call_malloc (newsize * sizeof (short)); \ |
85 | newvs = really_call_malloc (newsize * sizeof (YYSTYPE)); \ | |
94a50397 RH |
86 | if (newss) \ |
87 | memcpy (newss, *(SS), (SSSIZE)); \ | |
88 | if (newvs) \ | |
89 | memcpy (newvs, *(VS), (VSSIZE)); \ | |
90 | } \ | |
91 | if (!newss || !newvs) \ | |
92 | { \ | |
93 | yyerror (MSG); \ | |
94 | return 2; \ | |
95 | } \ | |
96 | *(SS) = newss; \ | |
97 | *(VS) = newvs; \ | |
98 | malloced_yyss = newss; \ | |
99 | malloced_yyvs = (void *) newvs; \ | |
100 | } while (0) | |
028299c6 RS |
101 | %} |
102 | ||
103 | %start program | |
104 | ||
105 | %union {long itype; tree ttype; enum tree_code code; | |
374a4e6c | 106 | location_t location; } |
028299c6 RS |
107 | |
108 | /* All identifiers that are not reserved words | |
109 | and are not declared typedefs in the current block */ | |
110 | %token IDENTIFIER | |
111 | ||
112 | /* All identifiers that are declared typedefs in the current block. | |
113 | In some contexts, they are treated just like IDENTIFIER, | |
114 | but they can also serve as typespecs in declarations. */ | |
115 | %token TYPENAME | |
116 | ||
117 | /* Reserved words that specify storage class. | |
118 | yylval contains an IDENTIFIER_NODE which indicates which one. */ | |
f79f2651 NB |
119 | %token SCSPEC /* Storage class other than static. */ |
120 | %token STATIC /* Static storage class. */ | |
028299c6 RS |
121 | |
122 | /* Reserved words that specify type. | |
123 | yylval contains an IDENTIFIER_NODE which indicates which one. */ | |
124 | %token TYPESPEC | |
125 | ||
3932261a | 126 | /* Reserved words that qualify type: "const", "volatile", or "restrict". |
028299c6 RS |
127 | yylval contains an IDENTIFIER_NODE which indicates which one. */ |
128 | %token TYPE_QUAL | |
129 | ||
130 | /* Character or numeric constants. | |
131 | yylval is the node for the constant. */ | |
132 | %token CONSTANT | |
133 | ||
a23c9413 NB |
134 | /* String constants in raw form. |
135 | yylval is a STRING_CST node. */ | |
d479d37f | 136 | |
a23c9413 | 137 | %token STRING |
028299c6 RS |
138 | |
139 | /* "...", used for functions with variable arglists. */ | |
140 | %token ELLIPSIS | |
141 | ||
142 | /* the reserved words */ | |
143 | /* SCO include files test "ASM", so use something else. */ | |
144 | %token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT | |
5ed7f7b1 | 145 | %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD TYPEOF ALIGNOF |
028299c6 | 146 | %token ATTRIBUTE EXTENSION LABEL |
ecbcf7b3 | 147 | %token REALPART IMAGPART VA_ARG CHOOSE_EXPR TYPES_COMPATIBLE_P |
4b4f19ec | 148 | %token PTR_VALUE PTR_BASE PTR_EXTENT |
e6cc3a24 | 149 | %token FUNC_NAME |
0ba8a114 | 150 | |
028299c6 RS |
151 | /* Add precedence rules to solve dangling else s/r conflict */ |
152 | %nonassoc IF | |
153 | %nonassoc ELSE | |
154 | ||
155 | /* Define the operator tokens and their precedences. | |
156 | The value is an integer because, if used, it is the tree code | |
157 | to use in the expression made from the operator. */ | |
158 | ||
159 | %right <code> ASSIGN '=' | |
160 | %right <code> '?' ':' | |
161 | %left <code> OROR | |
162 | %left <code> ANDAND | |
163 | %left <code> '|' | |
164 | %left <code> '^' | |
165 | %left <code> '&' | |
166 | %left <code> EQCOMPARE | |
167 | %left <code> ARITHCOMPARE | |
168 | %left <code> LSHIFT RSHIFT | |
169 | %left <code> '+' '-' | |
170 | %left <code> '*' '/' '%' | |
171 | %right <code> UNARY PLUSPLUS MINUSMINUS | |
172 | %left HYPERUNARY | |
173 | %left <code> POINTSAT '.' '(' '[' | |
174 | ||
175 | /* The Objective-C keywords. These are included in C and in | |
176 | Objective C, so that the token codes are the same in both. */ | |
177 | %token INTERFACE IMPLEMENTATION END SELECTOR DEFS ENCODE | |
e31c7eec | 178 | %token CLASSNAME PUBLIC PRIVATE PROTECTED PROTOCOL OBJECTNAME CLASS ALIAS |
264fa2db | 179 | %token AT_THROW AT_TRY AT_CATCH AT_FINALLY AT_SYNCHRONIZED |
e6cc3a24 | 180 | %token OBJC_STRING |
e31c7eec | 181 | |
028299c6 | 182 | %type <code> unop |
0e5921e8 ZW |
183 | %type <ttype> ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT |
184 | %type <ttype> BREAK CONTINUE RETURN GOTO ASM_KEYWORD SIZEOF TYPEOF ALIGNOF | |
028299c6 RS |
185 | |
186 | %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist | |
b84a3874 | 187 | %type <ttype> expr_no_commas cast_expr unary_expr primary STRING |
25d78ace JM |
188 | %type <ttype> declspecs_nosc_nots_nosa_noea declspecs_nosc_nots_nosa_ea |
189 | %type <ttype> declspecs_nosc_nots_sa_noea declspecs_nosc_nots_sa_ea | |
190 | %type <ttype> declspecs_nosc_ts_nosa_noea declspecs_nosc_ts_nosa_ea | |
191 | %type <ttype> declspecs_nosc_ts_sa_noea declspecs_nosc_ts_sa_ea | |
192 | %type <ttype> declspecs_sc_nots_nosa_noea declspecs_sc_nots_nosa_ea | |
193 | %type <ttype> declspecs_sc_nots_sa_noea declspecs_sc_nots_sa_ea | |
194 | %type <ttype> declspecs_sc_ts_nosa_noea declspecs_sc_ts_nosa_ea | |
195 | %type <ttype> declspecs_sc_ts_sa_noea declspecs_sc_ts_sa_ea | |
196 | %type <ttype> declspecs_ts declspecs_nots | |
197 | %type <ttype> declspecs_ts_nosa declspecs_nots_nosa | |
198 | %type <ttype> declspecs_nosc_ts declspecs_nosc_nots declspecs_nosc declspecs | |
91d231cb | 199 | %type <ttype> maybe_type_quals_attrs typespec_nonattr typespec_attr |
25d78ace JM |
200 | %type <ttype> typespec_reserved_nonattr typespec_reserved_attr |
201 | %type <ttype> typespec_nonreserved_nonattr | |
202 | ||
9f0e2d86 ZW |
203 | %type <ttype> scspec SCSPEC STATIC TYPESPEC TYPE_QUAL maybe_volatile |
204 | %type <ttype> initdecls notype_initdecls initdcl notype_initdcl init | |
8507c40a | 205 | %type <ttype> simple_asm_expr maybeasm asm_stmt asm_argument |
028299c6 | 206 | %type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers |
660b43c8 | 207 | %type <ttype> maybe_attribute attributes attribute attribute_list attrib |
1aaec916 | 208 | %type <ttype> any_word |
028299c6 | 209 | |
8f17b5c5 | 210 | %type <ttype> compstmt compstmt_start compstmt_nostart compstmt_primary_start |
64094f6a | 211 | %type <ttype> do_stmt_start poplevel stmt label |
028299c6 | 212 | |
444ca59f | 213 | %type <ttype> c99_block_start c99_block_end |
028299c6 RS |
214 | %type <ttype> declarator |
215 | %type <ttype> notype_declarator after_type_declarator | |
216 | %type <ttype> parm_declarator | |
97d24516 | 217 | %type <ttype> parm_declarator_starttypename parm_declarator_nostarttypename |
0e03329a | 218 | %type <ttype> array_declarator |
028299c6 | 219 | |
25d78ace JM |
220 | %type <ttype> structsp_attr structsp_nonattr |
221 | %type <ttype> component_decl_list component_decl_list2 | |
222 | %type <ttype> component_decl components components_notype component_declarator | |
223 | %type <ttype> component_notype_declarator | |
028299c6 | 224 | %type <ttype> enumlist enumerator |
4051959b | 225 | %type <ttype> struct_head union_head enum_head |
25d78ace JM |
226 | %type <ttype> typename absdcl absdcl1 absdcl1_ea absdcl1_noea |
227 | %type <ttype> direct_absdcl1 absdcl_maybe_attribute | |
228 | %type <ttype> xexpr parms parm firstparm identifiers | |
028299c6 RS |
229 | |
230 | %type <ttype> parmlist parmlist_1 parmlist_2 | |
231 | %type <ttype> parmlist_or_identifiers parmlist_or_identifiers_1 | |
232 | %type <ttype> identifiers_or_typenames | |
233 | ||
1aaec916 | 234 | %type <itype> setspecs setspecs_fp extension |
028299c6 | 235 | |
374a4e6c | 236 | %type <location> save_location |
028299c6 | 237 | \f |
264fa2db | 238 | @@ifobjc |
028299c6 RS |
239 | /* the Objective-C nonterminals */ |
240 | ||
241 | %type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator | |
242 | %type <ttype> methoddecl unaryselector keywordselector selector | |
243 | %type <ttype> keyworddecl receiver objcmessageexpr messageargs | |
244 | %type <ttype> keywordexpr keywordarglist keywordarg | |
245 | %type <ttype> myparms myparm optparmlist reservedwords objcselectorexpr | |
246 | %type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr | |
e6cc3a24 | 247 | %type <ttype> non_empty_protocolrefs protocolrefs identifier_list objcprotocolexpr |
957a1c32 | 248 | |
e6cc3a24 | 249 | %type <ttype> CLASSNAME OBJECTNAME OBJC_STRING |
264fa2db | 250 | |
4a6bcd93 | 251 | %type <ttype> superclass |
264fa2db ZL |
252 | %type <itype> objc_try_catch_stmt objc_finally_block |
253 | @@end_ifobjc | |
028299c6 RS |
254 | \f |
255 | %{ | |
84d901be | 256 | /* Number of statements (loosely speaking) and compound statements |
818e50a5 | 257 | seen so far. */ |
028299c6 | 258 | static int stmt_count; |
818e50a5 | 259 | static int compstmt_count; |
84d901be | 260 | |
49468c8b | 261 | /* Input location of the end of the body of last simple_if; |
028299c6 | 262 | used by the stmt-rule immediately after simple_if returns. */ |
49468c8b GDR |
263 | static location_t if_stmt_locus; |
264 | ||
028299c6 RS |
265 | |
266 | /* List of types and structure classes of the current declaration. */ | |
e2500fed GK |
267 | static GTY(()) tree current_declspecs; |
268 | static GTY(()) tree prefix_attributes; | |
028299c6 | 269 | |
4b01f8d8 JM |
270 | /* List of all the attributes applying to the identifier currently being |
271 | declared; includes prefix_attributes and possibly some more attributes | |
272 | just after a comma. */ | |
e2500fed | 273 | static GTY(()) tree all_prefix_attributes; |
4b01f8d8 JM |
274 | |
275 | /* Stack of saved values of current_declspecs, prefix_attributes and | |
276 | all_prefix_attributes. */ | |
e2500fed | 277 | static GTY(()) tree declspec_stack; |
028299c6 | 278 | |
4b01f8d8 JM |
279 | /* PUSH_DECLSPEC_STACK is called from setspecs; POP_DECLSPEC_STACK |
280 | should be called from the productions making use of setspecs. */ | |
281 | #define PUSH_DECLSPEC_STACK \ | |
282 | do { \ | |
283 | declspec_stack = tree_cons (build_tree_list (prefix_attributes, \ | |
284 | all_prefix_attributes), \ | |
285 | current_declspecs, \ | |
286 | declspec_stack); \ | |
287 | } while (0) | |
288 | ||
289 | #define POP_DECLSPEC_STACK \ | |
290 | do { \ | |
291 | current_declspecs = TREE_VALUE (declspec_stack); \ | |
292 | prefix_attributes = TREE_PURPOSE (TREE_PURPOSE (declspec_stack)); \ | |
293 | all_prefix_attributes = TREE_VALUE (TREE_PURPOSE (declspec_stack)); \ | |
294 | declspec_stack = TREE_CHAIN (declspec_stack); \ | |
295 | } while (0) | |
296 | ||
c3b6e114 JK |
297 | /* For __extension__, save/restore the warning flags which are |
298 | controlled by __extension__. */ | |
1aaec916 RH |
299 | #define SAVE_EXT_FLAGS() \ |
300 | (pedantic \ | |
301 | | (warn_pointer_arith << 1) \ | |
302 | | (warn_traditional << 2) \ | |
303 | | (flag_iso << 3)) | |
5137bd4f | 304 | |
1aaec916 | 305 | #define RESTORE_EXT_FLAGS(val) \ |
5137bd4f | 306 | do { \ |
5137bd4f RH |
307 | pedantic = val & 1; \ |
308 | warn_pointer_arith = (val >> 1) & 1; \ | |
309 | warn_traditional = (val >> 2) & 1; \ | |
750491fc | 310 | flag_iso = (val >> 3) & 1; \ |
c3b6e114 JK |
311 | } while (0) |
312 | ||
264fa2db | 313 | @@ifobjc |
8607f1bc ZL |
314 | /* Objective-C specific parser/lexer information */ |
315 | ||
316 | static enum tree_code objc_inherit_code; | |
317 | static int objc_pq_context = 0, objc_public_flag = 0; | |
028299c6 | 318 | |
f2e6e530 | 319 | /* The following flag is needed to contextualize ObjC lexical analysis. |
84d901be AD |
320 | In some cases (e.g., 'int NSObject;'), it is undesirable to bind |
321 | an identifier to an ObjC class, even if a class with that name | |
f2e6e530 | 322 | exists. */ |
8607f1bc | 323 | static int objc_need_raw_identifier; |
f2e6e530 | 324 | #define OBJC_NEED_RAW_IDENTIFIER(VAL) objc_need_raw_identifier = VAL |
264fa2db | 325 | @@end_ifobjc |
028299c6 | 326 | |
264fa2db | 327 | @@ifc |
f2e6e530 | 328 | #define OBJC_NEED_RAW_IDENTIFIER(VAL) /* nothing */ |
264fa2db | 329 | @@end_ifc |
f2e6e530 | 330 | |
622d3731 KG |
331 | static bool parsing_iso_function_signature; |
332 | ||
028299c6 RS |
333 | /* Tell yyparse how to print a token's value, if yydebug is set. */ |
334 | ||
335 | #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) | |
0e5921e8 | 336 | |
f55ade6e AJ |
337 | static void yyprint (FILE *, int, YYSTYPE); |
338 | static void yyerror (const char *); | |
339 | static int yylexname (void); | |
340 | static inline int _yylex (void); | |
341 | static int yylex (void); | |
342 | static void init_reswords (void); | |
1526a060 | 343 | |
e2500fed | 344 | /* Initialisation routine for this file. */ |
1526a060 | 345 | void |
f55ade6e | 346 | c_parse_init (void) |
1526a060 | 347 | { |
f5e99456 | 348 | init_reswords (); |
1526a060 BS |
349 | } |
350 | ||
028299c6 RS |
351 | %} |
352 | \f | |
353 | %% | |
354 | program: /* empty */ | |
355 | { if (pedantic) | |
89abf8d1 | 356 | pedwarn ("ISO C forbids an empty source file"); |
028299c6 RS |
357 | } |
358 | | extdefs | |
028299c6 RS |
359 | ; |
360 | ||
361 | /* the reason for the strange actions in this rule | |
362 | is so that notype_initdecls when reached via datadef | |
363 | can find a valid list of type and sc specs in $0. */ | |
364 | ||
365 | extdefs: | |
366 | {$<ttype>$ = NULL_TREE; } extdef | |
fbddce27 | 367 | | extdefs {$<ttype>$ = NULL_TREE; ggc_collect(); } extdef |
028299c6 RS |
368 | ; |
369 | ||
370 | extdef: | |
622d3731 KG |
371 | extdef_1 |
372 | { parsing_iso_function_signature = false; } /* Reset after any external definition. */ | |
17f44f02 | 373 | ; |
622d3731 KG |
374 | |
375 | extdef_1: | |
028299c6 RS |
376 | fndef |
377 | | datadef | |
9f0e2d86 ZW |
378 | | asmdef |
379 | | extension extdef | |
380 | { RESTORE_EXT_FLAGS ($1); } | |
264fa2db | 381 | @@ifobjc |
028299c6 | 382 | | objcdef |
264fa2db | 383 | @@end_ifobjc |
028299c6 RS |
384 | ; |
385 | ||
386 | datadef: | |
387 | setspecs notype_initdecls ';' | |
388 | { if (pedantic) | |
89abf8d1 | 389 | error ("ISO C forbids data definition with no type or storage class"); |
f458d1d5 | 390 | else |
84d901be | 391 | warning ("data definition has no type or storage class"); |
962a2496 | 392 | |
4b01f8d8 | 393 | POP_DECLSPEC_STACK; } |
25d78ace | 394 | | declspecs_nots setspecs notype_initdecls ';' |
4b01f8d8 | 395 | { POP_DECLSPEC_STACK; } |
25d78ace | 396 | | declspecs_ts setspecs initdecls ';' |
4b01f8d8 | 397 | { POP_DECLSPEC_STACK; } |
25d78ace | 398 | | declspecs ';' |
028299c6 RS |
399 | { shadow_tag ($1); } |
400 | | error ';' | |
401 | | error '}' | |
402 | | ';' | |
403 | { if (pedantic) | |
89abf8d1 | 404 | pedwarn ("ISO C does not allow extra `;' outside of a function"); } |
028299c6 RS |
405 | ; |
406 | \f | |
407 | fndef: | |
25d78ace | 408 | declspecs_ts setspecs declarator |
084c4c25 | 409 | { if (! start_function (current_declspecs, $3, |
4b01f8d8 | 410 | all_prefix_attributes)) |
028299c6 | 411 | YYERROR1; |
0e5921e8 | 412 | } |
374a4e6c | 413 | old_style_parm_decls save_location |
f31686a3 | 414 | { DECL_SOURCE_LOCATION (current_function_decl) = $6; |
b190f239 | 415 | store_parm_decls (); } |
374a4e6c | 416 | compstmt_or_error |
4a46cbfb | 417 | { finish_function (); |
4b01f8d8 | 418 | POP_DECLSPEC_STACK; } |
25d78ace | 419 | | declspecs_ts setspecs declarator error |
4b01f8d8 | 420 | { POP_DECLSPEC_STACK; } |
25d78ace | 421 | | declspecs_nots setspecs notype_declarator |
084c4c25 | 422 | { if (! start_function (current_declspecs, $3, |
4b01f8d8 | 423 | all_prefix_attributes)) |
028299c6 | 424 | YYERROR1; |
0e5921e8 | 425 | } |
374a4e6c | 426 | old_style_parm_decls save_location |
f31686a3 | 427 | { DECL_SOURCE_LOCATION (current_function_decl) = $6; |
b190f239 NS |
428 | store_parm_decls (); } |
429 | compstmt_or_error | |
4a46cbfb | 430 | { finish_function (); |
4b01f8d8 | 431 | POP_DECLSPEC_STACK; } |
25d78ace | 432 | | declspecs_nots setspecs notype_declarator error |
4b01f8d8 | 433 | { POP_DECLSPEC_STACK; } |
9fe9dd86 | 434 | | setspecs notype_declarator |
866890d9 | 435 | { if (! start_function (NULL_TREE, $2, |
4b01f8d8 | 436 | all_prefix_attributes)) |
028299c6 | 437 | YYERROR1; |
0e5921e8 | 438 | } |
374a4e6c | 439 | old_style_parm_decls save_location |
f31686a3 | 440 | { DECL_SOURCE_LOCATION (current_function_decl) = $5; |
b190f239 NS |
441 | store_parm_decls (); } |
442 | compstmt_or_error | |
4a46cbfb | 443 | { finish_function (); |
4b01f8d8 | 444 | POP_DECLSPEC_STACK; } |
028299c6 | 445 | | setspecs notype_declarator error |
4b01f8d8 | 446 | { POP_DECLSPEC_STACK; } |
028299c6 RS |
447 | ; |
448 | ||
449 | identifier: | |
450 | IDENTIFIER | |
451 | | TYPENAME | |
264fa2db | 452 | @@ifobjc |
e31c7eec | 453 | | OBJECTNAME |
f2e6e530 | 454 | | CLASSNAME |
264fa2db | 455 | @@end_ifobjc |
028299c6 RS |
456 | ; |
457 | ||
458 | unop: '&' | |
459 | { $$ = ADDR_EXPR; } | |
460 | | '-' | |
461 | { $$ = NEGATE_EXPR; } | |
462 | | '+' | |
895ea614 | 463 | { $$ = CONVERT_EXPR; |
264fa2db | 464 | @@ifc |
aac625ac | 465 | if (warn_traditional && !in_system_header) |
895ea614 | 466 | warning ("traditional C rejects the unary plus operator"); |
264fa2db | 467 | @@end_ifc |
895ea614 | 468 | } |
028299c6 RS |
469 | | PLUSPLUS |
470 | { $$ = PREINCREMENT_EXPR; } | |
471 | | MINUSMINUS | |
472 | { $$ = PREDECREMENT_EXPR; } | |
473 | | '~' | |
474 | { $$ = BIT_NOT_EXPR; } | |
475 | | '!' | |
476 | { $$ = TRUTH_NOT_EXPR; } | |
477 | ; | |
478 | ||
479 | expr: nonnull_exprlist | |
480 | { $$ = build_compound_expr ($1); } | |
481 | ; | |
482 | ||
483 | exprlist: | |
484 | /* empty */ | |
485 | { $$ = NULL_TREE; } | |
486 | | nonnull_exprlist | |
487 | ; | |
488 | ||
489 | nonnull_exprlist: | |
490 | expr_no_commas | |
491 | { $$ = build_tree_list (NULL_TREE, $1); } | |
492 | | nonnull_exprlist ',' expr_no_commas | |
493 | { chainon ($1, build_tree_list (NULL_TREE, $3)); } | |
494 | ; | |
495 | ||
496 | unary_expr: | |
497 | primary | |
498 | | '*' cast_expr %prec UNARY | |
499 | { $$ = build_indirect_ref ($2, "unary *"); } | |
500 | /* __extension__ turns off -pedantic for following primary. */ | |
72acf258 JM |
501 | | extension cast_expr %prec UNARY |
502 | { $$ = $2; | |
750491fc | 503 | RESTORE_EXT_FLAGS ($1); } |
028299c6 | 504 | | unop cast_expr %prec UNARY |
5303129f RS |
505 | { $$ = build_unary_op ($1, $2, 0); |
506 | overflow_warning ($$); } | |
028299c6 RS |
507 | /* Refer to the address of a label as a pointer. */ |
508 | | ANDAND identifier | |
15b732b2 | 509 | { $$ = finish_label_address_expr ($2); } |
5f8f4a07 RK |
510 | | sizeof unary_expr %prec UNARY |
511 | { skip_evaluation--; | |
512 | if (TREE_CODE ($2) == COMPONENT_REF | |
818e50a5 | 513 | && DECL_C_BIT_FIELD (TREE_OPERAND ($2, 1))) |
028299c6 RS |
514 | error ("`sizeof' applied to a bit-field"); |
515 | $$ = c_sizeof (TREE_TYPE ($2)); } | |
5f8f4a07 RK |
516 | | sizeof '(' typename ')' %prec HYPERUNARY |
517 | { skip_evaluation--; | |
518 | $$ = c_sizeof (groktypename ($3)); } | |
519 | | alignof unary_expr %prec UNARY | |
520 | { skip_evaluation--; | |
521 | $$ = c_alignof_expr ($2); } | |
522 | | alignof '(' typename ')' %prec HYPERUNARY | |
523 | { skip_evaluation--; | |
524 | $$ = c_alignof (groktypename ($3)); } | |
475e8534 | 525 | | REALPART cast_expr %prec UNARY |
12d073e7 | 526 | { $$ = build_unary_op (REALPART_EXPR, $2, 0); } |
475e8534 | 527 | | IMAGPART cast_expr %prec UNARY |
12d073e7 | 528 | { $$ = build_unary_op (IMAGPART_EXPR, $2, 0); } |
028299c6 RS |
529 | ; |
530 | ||
5f8f4a07 RK |
531 | sizeof: |
532 | SIZEOF { skip_evaluation++; } | |
533 | ; | |
534 | ||
535 | alignof: | |
536 | ALIGNOF { skip_evaluation++; } | |
537 | ; | |
538 | ||
25587e40 AO |
539 | typeof: |
540 | TYPEOF { skip_evaluation++; } | |
541 | ; | |
542 | ||
028299c6 RS |
543 | cast_expr: |
544 | unary_expr | |
545 | | '(' typename ')' cast_expr %prec UNARY | |
15b732b2 | 546 | { $$ = c_cast_expr ($2, $4); } |
028299c6 RS |
547 | ; |
548 | ||
549 | expr_no_commas: | |
550 | cast_expr | |
551 | | expr_no_commas '+' expr_no_commas | |
552 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
553 | | expr_no_commas '-' expr_no_commas | |
554 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
555 | | expr_no_commas '*' expr_no_commas | |
556 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
557 | | expr_no_commas '/' expr_no_commas | |
558 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
559 | | expr_no_commas '%' expr_no_commas | |
560 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
561 | | expr_no_commas LSHIFT expr_no_commas | |
562 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
563 | | expr_no_commas RSHIFT expr_no_commas | |
564 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
565 | | expr_no_commas ARITHCOMPARE expr_no_commas | |
566 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
567 | | expr_no_commas EQCOMPARE expr_no_commas | |
568 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
569 | | expr_no_commas '&' expr_no_commas | |
570 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
571 | | expr_no_commas '|' expr_no_commas | |
572 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
573 | | expr_no_commas '^' expr_no_commas | |
574 | { $$ = parser_build_binary_op ($2, $1, $3); } | |
5f8f4a07 | 575 | | expr_no_commas ANDAND |
e57e265b | 576 | { $1 = (*lang_hooks.truthvalue_conversion) |
78ef5b89 | 577 | (default_conversion ($1)); |
de7df9eb | 578 | skip_evaluation += $1 == truthvalue_false_node; } |
5f8f4a07 | 579 | expr_no_commas |
de7df9eb | 580 | { skip_evaluation -= $1 == truthvalue_false_node; |
5f8f4a07 RK |
581 | $$ = parser_build_binary_op (TRUTH_ANDIF_EXPR, $1, $4); } |
582 | | expr_no_commas OROR | |
e57e265b | 583 | { $1 = (*lang_hooks.truthvalue_conversion) |
78ef5b89 | 584 | (default_conversion ($1)); |
de7df9eb | 585 | skip_evaluation += $1 == truthvalue_true_node; } |
5f8f4a07 | 586 | expr_no_commas |
de7df9eb | 587 | { skip_evaluation -= $1 == truthvalue_true_node; |
5f8f4a07 RK |
588 | $$ = parser_build_binary_op (TRUTH_ORIF_EXPR, $1, $4); } |
589 | | expr_no_commas '?' | |
e57e265b | 590 | { $1 = (*lang_hooks.truthvalue_conversion) |
78ef5b89 | 591 | (default_conversion ($1)); |
de7df9eb | 592 | skip_evaluation += $1 == truthvalue_false_node; } |
5f8f4a07 | 593 | expr ':' |
de7df9eb JM |
594 | { skip_evaluation += (($1 == truthvalue_true_node) |
595 | - ($1 == truthvalue_false_node)); } | |
5f8f4a07 | 596 | expr_no_commas |
de7df9eb | 597 | { skip_evaluation -= $1 == truthvalue_true_node; |
5f8f4a07 RK |
598 | $$ = build_conditional_expr ($1, $4, $7); } |
599 | | expr_no_commas '?' | |
600 | { if (pedantic) | |
89abf8d1 | 601 | pedwarn ("ISO C forbids omitting the middle term of a ?: expression"); |
5f8f4a07 | 602 | /* Make sure first operand is calculated only once. */ |
e57e265b PB |
603 | $<ttype>2 = save_expr (default_conversion ($1)); |
604 | $1 = (*lang_hooks.truthvalue_conversion) ($<ttype>2); | |
de7df9eb | 605 | skip_evaluation += $1 == truthvalue_true_node; } |
5f8f4a07 | 606 | ':' expr_no_commas |
de7df9eb | 607 | { skip_evaluation -= $1 == truthvalue_true_node; |
5f8f4a07 | 608 | $$ = build_conditional_expr ($1, $<ttype>2, $5); } |
028299c6 | 609 | | expr_no_commas '=' expr_no_commas |
19d6ff23 RH |
610 | { char class; |
611 | $$ = build_modify_expr ($1, NOP_EXPR, $3); | |
612 | class = TREE_CODE_CLASS (TREE_CODE ($$)); | |
686deecb | 613 | if (IS_EXPR_CODE_CLASS (class)) |
19d6ff23 RH |
614 | C_SET_EXP_ORIGINAL_CODE ($$, MODIFY_EXPR); |
615 | } | |
028299c6 | 616 | | expr_no_commas ASSIGN expr_no_commas |
19d6ff23 RH |
617 | { char class; |
618 | $$ = build_modify_expr ($1, $2, $3); | |
78ef5b89 NB |
619 | /* This inhibits warnings in |
620 | c_common_truthvalue_conversion. */ | |
19d6ff23 | 621 | class = TREE_CODE_CLASS (TREE_CODE ($$)); |
686deecb | 622 | if (IS_EXPR_CODE_CLASS (class)) |
19d6ff23 RH |
623 | C_SET_EXP_ORIGINAL_CODE ($$, ERROR_MARK); |
624 | } | |
028299c6 RS |
625 | ; |
626 | ||
627 | primary: | |
628 | IDENTIFIER | |
629 | { | |
7e585d16 ZW |
630 | if (yychar == YYEMPTY) |
631 | yychar = YYLEX; | |
632 | $$ = build_external_ref ($1, yychar == '('); | |
028299c6 RS |
633 | } |
634 | | CONSTANT | |
b84a3874 | 635 | | STRING |
e6cc3a24 | 636 | | FUNC_NAME |
0ba8a114 | 637 | { $$ = fname_decl (C_RID_CODE ($$), $$); } |
84d901be | 638 | | '(' typename ')' '{' |
cedd825f JM |
639 | { start_init (NULL_TREE, NULL, 0); |
640 | $2 = groktypename ($2); | |
641 | really_start_incremental_init ($2); } | |
642 | initlist_maybe_comma '}' %prec UNARY | |
db3acfa5 | 643 | { tree constructor = pop_init_level (0); |
cedd825f JM |
644 | tree type = $2; |
645 | finish_init (); | |
646 | ||
647 | if (pedantic && ! flag_isoc99) | |
b46b8fb4 | 648 | pedwarn ("ISO C90 forbids compound literals"); |
db3acfa5 | 649 | $$ = build_compound_literal (type, constructor); |
cedd825f | 650 | } |
028299c6 RS |
651 | | '(' expr ')' |
652 | { char class = TREE_CODE_CLASS (TREE_CODE ($2)); | |
686deecb | 653 | if (IS_EXPR_CODE_CLASS (class)) |
028299c6 RS |
654 | C_SET_EXP_ORIGINAL_CODE ($2, ERROR_MARK); |
655 | $$ = $2; } | |
656 | | '(' error ')' | |
657 | { $$ = error_mark_node; } | |
d0668a73 | 658 | | compstmt_primary_start compstmt_nostart ')' |
8f17b5c5 MM |
659 | { tree saved_last_tree; |
660 | ||
661 | if (pedantic) | |
662 | pedwarn ("ISO C forbids braced-groups within expressions"); | |
8f17b5c5 MM |
663 | saved_last_tree = COMPOUND_BODY ($1); |
664 | RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); | |
665 | last_tree = saved_last_tree; | |
666 | TREE_CHAIN (last_tree) = NULL_TREE; | |
667 | if (!last_expr_type) | |
668 | last_expr_type = void_type_node; | |
669 | $$ = build1 (STMT_EXPR, last_expr_type, $1); | |
670 | TREE_SIDE_EFFECTS ($$) = 1; | |
d0668a73 RH |
671 | } |
672 | | compstmt_primary_start error ')' | |
673 | { | |
8f17b5c5 MM |
674 | last_tree = COMPOUND_BODY ($1); |
675 | TREE_CHAIN (last_tree) = NULL_TREE; | |
d0668a73 | 676 | $$ = error_mark_node; |
028299c6 RS |
677 | } |
678 | | primary '(' exprlist ')' %prec '.' | |
679 | { $$ = build_function_call ($1, $3); } | |
2f401cc8 NS |
680 | | VA_ARG '(' expr_no_commas ',' typename ')' |
681 | { $$ = build_va_arg ($3, groktypename ($5)); } | |
d3b4cd6f | 682 | |
ecbcf7b3 AH |
683 | | CHOOSE_EXPR '(' expr_no_commas ',' expr_no_commas ',' expr_no_commas ')' |
684 | { | |
685 | tree c; | |
686 | ||
687 | c = fold ($3); | |
688 | STRIP_NOPS (c); | |
689 | if (TREE_CODE (c) != INTEGER_CST) | |
690 | error ("first argument to __builtin_choose_expr not a constant"); | |
691 | $$ = integer_zerop (c) ? $7 : $5; | |
692 | } | |
693 | | TYPES_COMPATIBLE_P '(' typename ',' typename ')' | |
694 | { | |
695 | tree e1, e2; | |
696 | ||
697 | e1 = TYPE_MAIN_VARIANT (groktypename ($3)); | |
698 | e2 = TYPE_MAIN_VARIANT (groktypename ($5)); | |
699 | ||
d1bd0ded | 700 | $$ = comptypes (e1, e2, COMPARE_STRICT) |
ecbcf7b3 AH |
701 | ? build_int_2 (1, 0) : build_int_2 (0, 0); |
702 | } | |
028299c6 RS |
703 | | primary '[' expr ']' %prec '.' |
704 | { $$ = build_array_ref ($1, $3); } | |
705 | | primary '.' identifier | |
706 | { | |
264fa2db | 707 | @@ifobjc |
a3eaca15 NB |
708 | if (!is_public ($1, $3)) |
709 | $$ = error_mark_node; | |
710 | else | |
264fa2db | 711 | @@end_ifobjc |
a3eaca15 | 712 | $$ = build_component_ref ($1, $3); |
028299c6 RS |
713 | } |
714 | | primary POINTSAT identifier | |
715 | { | |
716 | tree expr = build_indirect_ref ($1, "->"); | |
717 | ||
264fa2db | 718 | @@ifobjc |
a3eaca15 | 719 | if (!is_public (expr, $3)) |
028299c6 | 720 | $$ = error_mark_node; |
a3eaca15 | 721 | else |
264fa2db | 722 | @@end_ifobjc |
a3eaca15 | 723 | $$ = build_component_ref (expr, $3); |
028299c6 RS |
724 | } |
725 | | primary PLUSPLUS | |
726 | { $$ = build_unary_op (POSTINCREMENT_EXPR, $1, 0); } | |
727 | | primary MINUSMINUS | |
728 | { $$ = build_unary_op (POSTDECREMENT_EXPR, $1, 0); } | |
264fa2db | 729 | @@ifobjc |
028299c6 RS |
730 | | objcmessageexpr |
731 | { $$ = build_message_expr ($1); } | |
732 | | objcselectorexpr | |
733 | { $$ = build_selector_expr ($1); } | |
e31c7eec TW |
734 | | objcprotocolexpr |
735 | { $$ = build_protocol_expr ($1); } | |
028299c6 RS |
736 | | objcencodeexpr |
737 | { $$ = build_encode_expr ($1); } | |
e6cc3a24 | 738 | | OBJC_STRING |
e31c7eec | 739 | { $$ = build_objc_string_object ($1); } |
264fa2db | 740 | @@end_ifobjc |
028299c6 RS |
741 | ; |
742 | ||
084c4c25 | 743 | old_style_parm_decls: |
622d3731 KG |
744 | old_style_parm_decls_1 |
745 | { | |
746 | parsing_iso_function_signature = false; /* Reset after decls. */ | |
747 | } | |
17f44f02 | 748 | ; |
622d3731 KG |
749 | |
750 | old_style_parm_decls_1: | |
028299c6 | 751 | /* empty */ |
622d3731 KG |
752 | { |
753 | if (warn_traditional && !in_system_header | |
754 | && parsing_iso_function_signature) | |
755 | warning ("traditional C rejects ISO C style function definitions"); | |
c034f121 AJ |
756 | if (warn_old_style_definition && !in_system_header |
757 | && !parsing_iso_function_signature) | |
758 | warning ("old-style parameter declaration"); | |
622d3731 KG |
759 | parsing_iso_function_signature = false; /* Reset after warning. */ |
760 | } | |
028299c6 | 761 | | datadecls |
c034f121 AJ |
762 | { |
763 | if (warn_old_style_definition && !in_system_header) | |
764 | warning ("old-style parameter declaration"); | |
765 | } | |
028299c6 RS |
766 | ; |
767 | ||
768 | /* The following are analogous to lineno_decl, decls and decl | |
769 | except that they do not allow nested functions. | |
770 | They are used for old-style parm decls. */ | |
771 | lineno_datadecl: | |
374a4e6c | 772 | save_location datadecl |
028299c6 RS |
773 | { } |
774 | ; | |
775 | ||
776 | datadecls: | |
777 | lineno_datadecl | |
778 | | errstmt | |
779 | | datadecls lineno_datadecl | |
780 | | lineno_datadecl errstmt | |
781 | ; | |
782 | ||
084c4c25 RK |
783 | /* We don't allow prefix attributes here because they cause reduce/reduce |
784 | conflicts: we can't know whether we're parsing a function decl with | |
785 | attribute suffix, or function defn with attribute prefix on first old | |
786 | style parm. */ | |
028299c6 | 787 | datadecl: |
25d78ace | 788 | declspecs_ts_nosa setspecs initdecls ';' |
4b01f8d8 | 789 | { POP_DECLSPEC_STACK; } |
25d78ace | 790 | | declspecs_nots_nosa setspecs notype_initdecls ';' |
4b01f8d8 | 791 | { POP_DECLSPEC_STACK; } |
25d78ace | 792 | | declspecs_ts_nosa ';' |
028299c6 RS |
793 | { shadow_tag_warned ($1, 1); |
794 | pedwarn ("empty declaration"); } | |
25d78ace | 795 | | declspecs_nots_nosa ';' |
028299c6 RS |
796 | { pedwarn ("empty declaration"); } |
797 | ; | |
798 | ||
799 | /* This combination which saves a lineno before a decl | |
800 | is the normal thing to use, rather than decl itself. | |
801 | This is to avoid shift/reduce conflicts in contexts | |
802 | where statement labels are allowed. */ | |
803 | lineno_decl: | |
374a4e6c | 804 | save_location decl |
028299c6 RS |
805 | { } |
806 | ; | |
807 | ||
028299c6 RS |
808 | /* records the type and storage class specs to use for processing |
809 | the declarators that follow. | |
810 | Maintains a stack of outer-level values of current_declspecs, | |
811 | for the sake of parm declarations nested in function declarators. */ | |
812 | setspecs: /* empty */ | |
4dd7201e | 813 | { pending_xref_error (); |
4b01f8d8 | 814 | PUSH_DECLSPEC_STACK; |
084c4c25 | 815 | split_specs_attrs ($<ttype>0, |
4b01f8d8 JM |
816 | ¤t_declspecs, &prefix_attributes); |
817 | all_prefix_attributes = prefix_attributes; } | |
34724814 RK |
818 | ; |
819 | ||
4b01f8d8 JM |
820 | /* Possibly attributes after a comma, which should reset all_prefix_attributes |
821 | to prefix_attributes with these ones chained on the front. */ | |
822 | maybe_resetattrs: | |
91d231cb JM |
823 | maybe_attribute |
824 | { all_prefix_attributes = chainon ($1, prefix_attributes); } | |
4b01f8d8 JM |
825 | ; |
826 | ||
028299c6 | 827 | decl: |
25d78ace | 828 | declspecs_ts setspecs initdecls ';' |
4b01f8d8 | 829 | { POP_DECLSPEC_STACK; } |
25d78ace | 830 | | declspecs_nots setspecs notype_initdecls ';' |
4b01f8d8 | 831 | { POP_DECLSPEC_STACK; } |
25d78ace | 832 | | declspecs_ts setspecs nested_function |
4b01f8d8 | 833 | { POP_DECLSPEC_STACK; } |
25d78ace | 834 | | declspecs_nots setspecs notype_nested_function |
4b01f8d8 | 835 | { POP_DECLSPEC_STACK; } |
25d78ace | 836 | | declspecs ';' |
028299c6 | 837 | { shadow_tag ($1); } |
72acf258 | 838 | | extension decl |
750491fc | 839 | { RESTORE_EXT_FLAGS ($1); } |
028299c6 RS |
840 | ; |
841 | ||
25d78ace JM |
842 | /* A list of declaration specifiers. These are: |
843 | ||
f79f2651 | 844 | - Storage class specifiers (scspec), which for GCC currently includes |
25d78ace JM |
845 | function specifiers ("inline"). |
846 | ||
847 | - Type specifiers (typespec_*). | |
848 | ||
849 | - Type qualifiers (TYPE_QUAL). | |
850 | ||
851 | - Attribute specifier lists (attributes). | |
852 | ||
853 | These are stored as a TREE_LIST; the head of the list is the last | |
854 | item in the specifier list. Each entry in the list has either a | |
855 | TREE_PURPOSE that is an attribute specifier list, or a TREE_VALUE that | |
856 | is a single other specifier or qualifier; and a TREE_CHAIN that is the | |
857 | rest of the list. TREE_STATIC is set on the list if something other | |
858 | than a storage class specifier or attribute has been seen; this is used | |
859 | to warn for the obsolescent usage of storage class specifiers other than | |
860 | at the start of the list. (Doing this properly would require function | |
861 | specifiers to be handled separately from storage class specifiers.) | |
862 | ||
863 | The various cases below are classified according to: | |
864 | ||
865 | (a) Whether a storage class specifier is included or not; some | |
866 | places in the grammar disallow storage class specifiers (_sc or _nosc). | |
867 | ||
868 | (b) Whether a type specifier has been seen; after a type specifier, | |
869 | a typedef name is an identifier to redeclare (_ts or _nots). | |
870 | ||
871 | (c) Whether the list starts with an attribute; in certain places, | |
872 | the grammar requires specifiers that don't start with an attribute | |
873 | (_sa or _nosa). | |
874 | ||
875 | (d) Whether the list ends with an attribute (or a specifier such that | |
876 | any following attribute would have been parsed as part of that specifier); | |
877 | this avoids shift-reduce conflicts in the parsing of attributes | |
878 | (_ea or _noea). | |
879 | ||
880 | TODO: | |
881 | ||
882 | (i) Distinguish between function specifiers and storage class specifiers, | |
883 | at least for the purpose of warnings about obsolescent usage. | |
884 | ||
885 | (ii) Halve the number of productions here by eliminating the _sc/_nosc | |
886 | distinction and instead checking where required that storage class | |
887 | specifiers aren't present. */ | |
888 | ||
028299c6 RS |
889 | /* Declspecs which contain at least one type specifier or typedef name. |
890 | (Just `const' or `volatile' is not enough.) | |
084c4c25 RK |
891 | A typedef'd name following these is taken as a name to be declared. |
892 | Declspecs have a non-NULL TREE_VALUE, attributes do not. */ | |
028299c6 | 893 | |
25d78ace JM |
894 | declspecs_nosc_nots_nosa_noea: |
895 | TYPE_QUAL | |
896 | { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); | |
897 | TREE_STATIC ($$) = 1; } | |
898 | | declspecs_nosc_nots_nosa_noea TYPE_QUAL | |
899 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
900 | TREE_STATIC ($$) = 1; } | |
901 | | declspecs_nosc_nots_nosa_ea TYPE_QUAL | |
902 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
903 | TREE_STATIC ($$) = 1; } | |
028299c6 RS |
904 | ; |
905 | ||
25d78ace JM |
906 | declspecs_nosc_nots_nosa_ea: |
907 | declspecs_nosc_nots_nosa_noea attributes | |
908 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
909 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
910 | ; | |
911 | ||
912 | declspecs_nosc_nots_sa_noea: | |
913 | declspecs_nosc_nots_sa_noea TYPE_QUAL | |
914 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
915 | TREE_STATIC ($$) = 1; } | |
916 | | declspecs_nosc_nots_sa_ea TYPE_QUAL | |
917 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
918 | TREE_STATIC ($$) = 1; } | |
919 | ; | |
920 | ||
921 | declspecs_nosc_nots_sa_ea: | |
922 | attributes | |
923 | { $$ = tree_cons ($1, NULL_TREE, NULL_TREE); | |
924 | TREE_STATIC ($$) = 0; } | |
925 | | declspecs_nosc_nots_sa_noea attributes | |
926 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
927 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
928 | ; | |
929 | ||
930 | declspecs_nosc_ts_nosa_noea: | |
931 | typespec_nonattr | |
932 | { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); | |
933 | TREE_STATIC ($$) = 1; } | |
934 | | declspecs_nosc_ts_nosa_noea TYPE_QUAL | |
935 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
936 | TREE_STATIC ($$) = 1; } | |
937 | | declspecs_nosc_ts_nosa_ea TYPE_QUAL | |
938 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
939 | TREE_STATIC ($$) = 1; } | |
940 | | declspecs_nosc_ts_nosa_noea typespec_reserved_nonattr | |
941 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
942 | TREE_STATIC ($$) = 1; } | |
943 | | declspecs_nosc_ts_nosa_ea typespec_reserved_nonattr | |
944 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
945 | TREE_STATIC ($$) = 1; } | |
946 | | declspecs_nosc_nots_nosa_noea typespec_nonattr | |
947 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
948 | TREE_STATIC ($$) = 1; } | |
949 | | declspecs_nosc_nots_nosa_ea typespec_nonattr | |
950 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
951 | TREE_STATIC ($$) = 1; } | |
952 | ; | |
953 | ||
954 | declspecs_nosc_ts_nosa_ea: | |
955 | typespec_attr | |
956 | { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); | |
957 | TREE_STATIC ($$) = 1; } | |
958 | | declspecs_nosc_ts_nosa_noea attributes | |
959 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
960 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
961 | | declspecs_nosc_ts_nosa_noea typespec_reserved_attr | |
962 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
963 | TREE_STATIC ($$) = 1; } | |
964 | | declspecs_nosc_ts_nosa_ea typespec_reserved_attr | |
965 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
966 | TREE_STATIC ($$) = 1; } | |
967 | | declspecs_nosc_nots_nosa_noea typespec_attr | |
968 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
969 | TREE_STATIC ($$) = 1; } | |
970 | | declspecs_nosc_nots_nosa_ea typespec_attr | |
971 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
972 | TREE_STATIC ($$) = 1; } | |
973 | ; | |
974 | ||
975 | declspecs_nosc_ts_sa_noea: | |
976 | declspecs_nosc_ts_sa_noea TYPE_QUAL | |
977 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
978 | TREE_STATIC ($$) = 1; } | |
979 | | declspecs_nosc_ts_sa_ea TYPE_QUAL | |
980 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
981 | TREE_STATIC ($$) = 1; } | |
982 | | declspecs_nosc_ts_sa_noea typespec_reserved_nonattr | |
983 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
984 | TREE_STATIC ($$) = 1; } | |
985 | | declspecs_nosc_ts_sa_ea typespec_reserved_nonattr | |
986 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
987 | TREE_STATIC ($$) = 1; } | |
988 | | declspecs_nosc_nots_sa_noea typespec_nonattr | |
989 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
990 | TREE_STATIC ($$) = 1; } | |
991 | | declspecs_nosc_nots_sa_ea typespec_nonattr | |
992 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
993 | TREE_STATIC ($$) = 1; } | |
994 | ; | |
995 | ||
996 | declspecs_nosc_ts_sa_ea: | |
997 | declspecs_nosc_ts_sa_noea attributes | |
998 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
999 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
1000 | | declspecs_nosc_ts_sa_noea typespec_reserved_attr | |
1001 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1002 | TREE_STATIC ($$) = 1; } | |
1003 | | declspecs_nosc_ts_sa_ea typespec_reserved_attr | |
1004 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1005 | TREE_STATIC ($$) = 1; } | |
1006 | | declspecs_nosc_nots_sa_noea typespec_attr | |
1007 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1008 | TREE_STATIC ($$) = 1; } | |
1009 | | declspecs_nosc_nots_sa_ea typespec_attr | |
1010 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1011 | TREE_STATIC ($$) = 1; } | |
1012 | ; | |
1013 | ||
1014 | declspecs_sc_nots_nosa_noea: | |
f79f2651 | 1015 | scspec |
25d78ace JM |
1016 | { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); |
1017 | TREE_STATIC ($$) = 0; } | |
1018 | | declspecs_sc_nots_nosa_noea TYPE_QUAL | |
1019 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1020 | TREE_STATIC ($$) = 1; } | |
1021 | | declspecs_sc_nots_nosa_ea TYPE_QUAL | |
1022 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1023 | TREE_STATIC ($$) = 1; } | |
f79f2651 | 1024 | | declspecs_nosc_nots_nosa_noea scspec |
25d78ace | 1025 | { if (extra_warnings && TREE_STATIC ($1)) |
028299c6 RS |
1026 | warning ("`%s' is not at beginning of declaration", |
1027 | IDENTIFIER_POINTER ($2)); | |
25d78ace JM |
1028 | $$ = tree_cons (NULL_TREE, $2, $1); |
1029 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1030 | | declspecs_nosc_nots_nosa_ea scspec |
25d78ace JM |
1031 | { if (extra_warnings && TREE_STATIC ($1)) |
1032 | warning ("`%s' is not at beginning of declaration", | |
1033 | IDENTIFIER_POINTER ($2)); | |
1034 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1035 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1036 | | declspecs_sc_nots_nosa_noea scspec |
25d78ace JM |
1037 | { if (extra_warnings && TREE_STATIC ($1)) |
1038 | warning ("`%s' is not at beginning of declaration", | |
1039 | IDENTIFIER_POINTER ($2)); | |
1040 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1041 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1042 | | declspecs_sc_nots_nosa_ea scspec |
25d78ace JM |
1043 | { if (extra_warnings && TREE_STATIC ($1)) |
1044 | warning ("`%s' is not at beginning of declaration", | |
1045 | IDENTIFIER_POINTER ($2)); | |
1046 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1047 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
084c4c25 RK |
1048 | ; |
1049 | ||
25d78ace JM |
1050 | declspecs_sc_nots_nosa_ea: |
1051 | declspecs_sc_nots_nosa_noea attributes | |
1052 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
1053 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
084c4c25 RK |
1054 | ; |
1055 | ||
25d78ace JM |
1056 | declspecs_sc_nots_sa_noea: |
1057 | declspecs_sc_nots_sa_noea TYPE_QUAL | |
1058 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1059 | TREE_STATIC ($$) = 1; } | |
1060 | | declspecs_sc_nots_sa_ea TYPE_QUAL | |
1061 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1062 | TREE_STATIC ($$) = 1; } | |
f79f2651 | 1063 | | declspecs_nosc_nots_sa_noea scspec |
25d78ace JM |
1064 | { if (extra_warnings && TREE_STATIC ($1)) |
1065 | warning ("`%s' is not at beginning of declaration", | |
1066 | IDENTIFIER_POINTER ($2)); | |
1067 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1068 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1069 | | declspecs_nosc_nots_sa_ea scspec |
25d78ace JM |
1070 | { if (extra_warnings && TREE_STATIC ($1)) |
1071 | warning ("`%s' is not at beginning of declaration", | |
1072 | IDENTIFIER_POINTER ($2)); | |
1073 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1074 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1075 | | declspecs_sc_nots_sa_noea scspec |
25d78ace JM |
1076 | { if (extra_warnings && TREE_STATIC ($1)) |
1077 | warning ("`%s' is not at beginning of declaration", | |
1078 | IDENTIFIER_POINTER ($2)); | |
1079 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1080 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1081 | | declspecs_sc_nots_sa_ea scspec |
25d78ace | 1082 | { if (extra_warnings && TREE_STATIC ($1)) |
084c4c25 RK |
1083 | warning ("`%s' is not at beginning of declaration", |
1084 | IDENTIFIER_POINTER ($2)); | |
25d78ace JM |
1085 | $$ = tree_cons (NULL_TREE, $2, $1); |
1086 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
028299c6 RS |
1087 | ; |
1088 | ||
25d78ace JM |
1089 | declspecs_sc_nots_sa_ea: |
1090 | declspecs_sc_nots_sa_noea attributes | |
1091 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
1092 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
084c4c25 RK |
1093 | ; |
1094 | ||
25d78ace JM |
1095 | declspecs_sc_ts_nosa_noea: |
1096 | declspecs_sc_ts_nosa_noea TYPE_QUAL | |
1097 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
028299c6 | 1098 | TREE_STATIC ($$) = 1; } |
25d78ace JM |
1099 | | declspecs_sc_ts_nosa_ea TYPE_QUAL |
1100 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1101 | TREE_STATIC ($$) = 1; } | |
1102 | | declspecs_sc_ts_nosa_noea typespec_reserved_nonattr | |
1103 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1104 | TREE_STATIC ($$) = 1; } | |
1105 | | declspecs_sc_ts_nosa_ea typespec_reserved_nonattr | |
1106 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1107 | TREE_STATIC ($$) = 1; } | |
1108 | | declspecs_sc_nots_nosa_noea typespec_nonattr | |
028299c6 RS |
1109 | { $$ = tree_cons (NULL_TREE, $2, $1); |
1110 | TREE_STATIC ($$) = 1; } | |
25d78ace JM |
1111 | | declspecs_sc_nots_nosa_ea typespec_nonattr |
1112 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1113 | TREE_STATIC ($$) = 1; } | |
f79f2651 | 1114 | | declspecs_nosc_ts_nosa_noea scspec |
25d78ace JM |
1115 | { if (extra_warnings && TREE_STATIC ($1)) |
1116 | warning ("`%s' is not at beginning of declaration", | |
1117 | IDENTIFIER_POINTER ($2)); | |
1118 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1119 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1120 | | declspecs_nosc_ts_nosa_ea scspec |
25d78ace JM |
1121 | { if (extra_warnings && TREE_STATIC ($1)) |
1122 | warning ("`%s' is not at beginning of declaration", | |
1123 | IDENTIFIER_POINTER ($2)); | |
1124 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1125 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1126 | | declspecs_sc_ts_nosa_noea scspec |
25d78ace JM |
1127 | { if (extra_warnings && TREE_STATIC ($1)) |
1128 | warning ("`%s' is not at beginning of declaration", | |
1129 | IDENTIFIER_POINTER ($2)); | |
1130 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1131 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1132 | | declspecs_sc_ts_nosa_ea scspec |
028299c6 RS |
1133 | { if (extra_warnings && TREE_STATIC ($1)) |
1134 | warning ("`%s' is not at beginning of declaration", | |
1135 | IDENTIFIER_POINTER ($2)); | |
1136 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1137 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
1138 | ; | |
1139 | ||
25d78ace JM |
1140 | declspecs_sc_ts_nosa_ea: |
1141 | declspecs_sc_ts_nosa_noea attributes | |
1142 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
1143 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
1144 | | declspecs_sc_ts_nosa_noea typespec_reserved_attr | |
1145 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1146 | TREE_STATIC ($$) = 1; } | |
1147 | | declspecs_sc_ts_nosa_ea typespec_reserved_attr | |
1148 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1149 | TREE_STATIC ($$) = 1; } | |
1150 | | declspecs_sc_nots_nosa_noea typespec_attr | |
1151 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1152 | TREE_STATIC ($$) = 1; } | |
1153 | | declspecs_sc_nots_nosa_ea typespec_attr | |
1154 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1155 | TREE_STATIC ($$) = 1; } | |
1156 | ; | |
028299c6 | 1157 | |
25d78ace JM |
1158 | declspecs_sc_ts_sa_noea: |
1159 | declspecs_sc_ts_sa_noea TYPE_QUAL | |
1160 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1161 | TREE_STATIC ($$) = 1; } | |
1162 | | declspecs_sc_ts_sa_ea TYPE_QUAL | |
1163 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1164 | TREE_STATIC ($$) = 1; } | |
1165 | | declspecs_sc_ts_sa_noea typespec_reserved_nonattr | |
1166 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1167 | TREE_STATIC ($$) = 1; } | |
1168 | | declspecs_sc_ts_sa_ea typespec_reserved_nonattr | |
1169 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1170 | TREE_STATIC ($$) = 1; } | |
1171 | | declspecs_sc_nots_sa_noea typespec_nonattr | |
1172 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1173 | TREE_STATIC ($$) = 1; } | |
1174 | | declspecs_sc_nots_sa_ea typespec_nonattr | |
1175 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1176 | TREE_STATIC ($$) = 1; } | |
f79f2651 | 1177 | | declspecs_nosc_ts_sa_noea scspec |
25d78ace JM |
1178 | { if (extra_warnings && TREE_STATIC ($1)) |
1179 | warning ("`%s' is not at beginning of declaration", | |
1180 | IDENTIFIER_POINTER ($2)); | |
1181 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1182 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1183 | | declspecs_nosc_ts_sa_ea scspec |
25d78ace JM |
1184 | { if (extra_warnings && TREE_STATIC ($1)) |
1185 | warning ("`%s' is not at beginning of declaration", | |
1186 | IDENTIFIER_POINTER ($2)); | |
1187 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1188 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1189 | | declspecs_sc_ts_sa_noea scspec |
25d78ace JM |
1190 | { if (extra_warnings && TREE_STATIC ($1)) |
1191 | warning ("`%s' is not at beginning of declaration", | |
1192 | IDENTIFIER_POINTER ($2)); | |
1193 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1194 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
f79f2651 | 1195 | | declspecs_sc_ts_sa_ea scspec |
25d78ace JM |
1196 | { if (extra_warnings && TREE_STATIC ($1)) |
1197 | warning ("`%s' is not at beginning of declaration", | |
1198 | IDENTIFIER_POINTER ($2)); | |
1199 | $$ = tree_cons (NULL_TREE, $2, $1); | |
1200 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
1201 | ; | |
028299c6 | 1202 | |
25d78ace JM |
1203 | declspecs_sc_ts_sa_ea: |
1204 | declspecs_sc_ts_sa_noea attributes | |
1205 | { $$ = tree_cons ($2, NULL_TREE, $1); | |
1206 | TREE_STATIC ($$) = TREE_STATIC ($1); } | |
1207 | | declspecs_sc_ts_sa_noea typespec_reserved_attr | |
1208 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1209 | TREE_STATIC ($$) = 1; } | |
1210 | | declspecs_sc_ts_sa_ea typespec_reserved_attr | |
1211 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1212 | TREE_STATIC ($$) = 1; } | |
1213 | | declspecs_sc_nots_sa_noea typespec_attr | |
1214 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1215 | TREE_STATIC ($$) = 1; } | |
1216 | | declspecs_sc_nots_sa_ea typespec_attr | |
1217 | { $$ = tree_cons (NULL_TREE, $2, $1); | |
1218 | TREE_STATIC ($$) = 1; } | |
028299c6 RS |
1219 | ; |
1220 | ||
25d78ace JM |
1221 | /* Particular useful classes of declspecs. */ |
1222 | declspecs_ts: | |
1223 | declspecs_nosc_ts_nosa_noea | |
1224 | | declspecs_nosc_ts_nosa_ea | |
1225 | | declspecs_nosc_ts_sa_noea | |
1226 | | declspecs_nosc_ts_sa_ea | |
1227 | | declspecs_sc_ts_nosa_noea | |
1228 | | declspecs_sc_ts_nosa_ea | |
1229 | | declspecs_sc_ts_sa_noea | |
1230 | | declspecs_sc_ts_sa_ea | |
1231 | ; | |
1232 | ||
1233 | declspecs_nots: | |
1234 | declspecs_nosc_nots_nosa_noea | |
1235 | | declspecs_nosc_nots_nosa_ea | |
1236 | | declspecs_nosc_nots_sa_noea | |
1237 | | declspecs_nosc_nots_sa_ea | |
1238 | | declspecs_sc_nots_nosa_noea | |
1239 | | declspecs_sc_nots_nosa_ea | |
1240 | | declspecs_sc_nots_sa_noea | |
1241 | | declspecs_sc_nots_sa_ea | |
1242 | ; | |
1243 | ||
1244 | declspecs_ts_nosa: | |
1245 | declspecs_nosc_ts_nosa_noea | |
1246 | | declspecs_nosc_ts_nosa_ea | |
1247 | | declspecs_sc_ts_nosa_noea | |
1248 | | declspecs_sc_ts_nosa_ea | |
1249 | ; | |
1250 | ||
1251 | declspecs_nots_nosa: | |
1252 | declspecs_nosc_nots_nosa_noea | |
1253 | | declspecs_nosc_nots_nosa_ea | |
1254 | | declspecs_sc_nots_nosa_noea | |
1255 | | declspecs_sc_nots_nosa_ea | |
1256 | ; | |
1257 | ||
1258 | declspecs_nosc_ts: | |
1259 | declspecs_nosc_ts_nosa_noea | |
1260 | | declspecs_nosc_ts_nosa_ea | |
1261 | | declspecs_nosc_ts_sa_noea | |
1262 | | declspecs_nosc_ts_sa_ea | |
1263 | ; | |
1264 | ||
1265 | declspecs_nosc_nots: | |
1266 | declspecs_nosc_nots_nosa_noea | |
1267 | | declspecs_nosc_nots_nosa_ea | |
1268 | | declspecs_nosc_nots_sa_noea | |
1269 | | declspecs_nosc_nots_sa_ea | |
1270 | ; | |
1271 | ||
1272 | declspecs_nosc: | |
1273 | declspecs_nosc_ts_nosa_noea | |
1274 | | declspecs_nosc_ts_nosa_ea | |
1275 | | declspecs_nosc_ts_sa_noea | |
1276 | | declspecs_nosc_ts_sa_ea | |
1277 | | declspecs_nosc_nots_nosa_noea | |
1278 | | declspecs_nosc_nots_nosa_ea | |
1279 | | declspecs_nosc_nots_sa_noea | |
1280 | | declspecs_nosc_nots_sa_ea | |
1281 | ; | |
1282 | ||
1283 | declspecs: | |
1284 | declspecs_nosc_nots_nosa_noea | |
1285 | | declspecs_nosc_nots_nosa_ea | |
1286 | | declspecs_nosc_nots_sa_noea | |
1287 | | declspecs_nosc_nots_sa_ea | |
1288 | | declspecs_nosc_ts_nosa_noea | |
1289 | | declspecs_nosc_ts_nosa_ea | |
1290 | | declspecs_nosc_ts_sa_noea | |
1291 | | declspecs_nosc_ts_sa_ea | |
1292 | | declspecs_sc_nots_nosa_noea | |
1293 | | declspecs_sc_nots_nosa_ea | |
1294 | | declspecs_sc_nots_sa_noea | |
1295 | | declspecs_sc_nots_sa_ea | |
1296 | | declspecs_sc_ts_nosa_noea | |
1297 | | declspecs_sc_ts_nosa_ea | |
1298 | | declspecs_sc_ts_sa_noea | |
1299 | | declspecs_sc_ts_sa_ea | |
1300 | ; | |
1301 | ||
91d231cb JM |
1302 | /* A (possibly empty) sequence of type qualifiers and attributes. */ |
1303 | maybe_type_quals_attrs: | |
25d78ace | 1304 | /* empty */ |
028299c6 | 1305 | { $$ = NULL_TREE; } |
25d78ace | 1306 | | declspecs_nosc_nots |
91d231cb | 1307 | { $$ = $1; } |
028299c6 RS |
1308 | ; |
1309 | ||
25d78ace | 1310 | /* A type specifier (but not a type qualifier). |
028299c6 | 1311 | Once we have seen one of these in a declaration, |
25d78ace | 1312 | if a typedef name appears then it is being redeclared. |
028299c6 | 1313 | |
25d78ace JM |
1314 | The _reserved versions start with a reserved word and may appear anywhere |
1315 | in the declaration specifiers; the _nonreserved versions may only | |
1316 | appear before any other type specifiers, and after that are (if names) | |
1317 | being redeclared. | |
1318 | ||
1319 | FIXME: should the _nonreserved version be restricted to names being | |
1320 | redeclared only? The other entries there relate only the GNU extensions | |
1321 | and Objective C, and are historically parsed thus, and don't make sense | |
1322 | after other type specifiers, but it might be cleaner to count them as | |
1323 | _reserved. | |
1324 | ||
1325 | _attr means: specifiers that either end with attributes, | |
1326 | or are such that any following attributes would | |
1327 | be parsed as part of the specifier. | |
1328 | ||
1329 | _nonattr: specifiers. */ | |
1330 | ||
1331 | typespec_nonattr: | |
1332 | typespec_reserved_nonattr | |
1333 | | typespec_nonreserved_nonattr | |
1334 | ; | |
1335 | ||
1336 | typespec_attr: | |
1337 | typespec_reserved_attr | |
1338 | ; | |
1339 | ||
1340 | typespec_reserved_nonattr: | |
1341 | TYPESPEC | |
f2e6e530 | 1342 | { OBJC_NEED_RAW_IDENTIFIER (1); } |
25d78ace JM |
1343 | | structsp_nonattr |
1344 | ; | |
1345 | ||
1346 | typespec_reserved_attr: | |
1347 | structsp_attr | |
1348 | ; | |
1349 | ||
1350 | typespec_nonreserved_nonattr: | |
1351 | TYPENAME | |
028299c6 RS |
1352 | { /* For a typedef name, record the meaning, not the name. |
1353 | In case of `foo foo, bar;'. */ | |
1354 | $$ = lookup_name ($1); } | |
264fa2db | 1355 | @@ifobjc |
e31c7eec TW |
1356 | | CLASSNAME protocolrefs |
1357 | { $$ = get_static_reference ($1, $2); } | |
1358 | | OBJECTNAME protocolrefs | |
1359 | { $$ = get_object_reference ($2); } | |
957a1c32 RK |
1360 | |
1361 | /* Make "<SomeProtocol>" equivalent to "id <SomeProtocol>" | |
1362 | - nisse@lysator.liu.se */ | |
1363 | | non_empty_protocolrefs | |
1364 | { $$ = get_object_reference ($1); } | |
264fa2db | 1365 | @@end_ifobjc |
25587e40 | 1366 | | typeof '(' expr ')' |
65f0edec JM |
1367 | { skip_evaluation--; |
1368 | if (TREE_CODE ($3) == COMPONENT_REF | |
1369 | && DECL_C_BIT_FIELD (TREE_OPERAND ($3, 1))) | |
1370 | error ("`typeof' applied to a bit-field"); | |
1371 | $$ = TREE_TYPE ($3); } | |
25587e40 AO |
1372 | | typeof '(' typename ')' |
1373 | { skip_evaluation--; $$ = groktypename ($3); } | |
028299c6 RS |
1374 | ; |
1375 | ||
25d78ace | 1376 | /* typespec_nonreserved_attr does not exist. */ |
028299c6 RS |
1377 | |
1378 | initdecls: | |
1379 | initdcl | |
4b01f8d8 | 1380 | | initdecls ',' maybe_resetattrs initdcl |
028299c6 RS |
1381 | ; |
1382 | ||
1383 | notype_initdecls: | |
1384 | notype_initdcl | |
4b01f8d8 | 1385 | | notype_initdecls ',' maybe_resetattrs notype_initdcl |
028299c6 RS |
1386 | ; |
1387 | ||
028299c6 RS |
1388 | initdcl: |
1389 | declarator maybeasm maybe_attribute '=' | |
99ac47b5 | 1390 | { $<ttype>$ = start_decl ($1, current_declspecs, 1, |
4b01f8d8 | 1391 | chainon ($3, all_prefix_attributes)); |
6126f4db | 1392 | start_init ($<ttype>$, $2, global_bindings_p ()); } |
028299c6 RS |
1393 | init |
1394 | /* Note how the declaration of the variable is in effect while its init is parsed! */ | |
42e651a6 | 1395 | { finish_init (); |
6126f4db | 1396 | finish_decl ($<ttype>5, $6, $2); } |
028299c6 | 1397 | | declarator maybeasm maybe_attribute |
99ac47b5 | 1398 | { tree d = start_decl ($1, current_declspecs, 0, |
4b01f8d8 | 1399 | chainon ($3, all_prefix_attributes)); |
84d901be | 1400 | finish_decl (d, NULL_TREE, $2); |
34724814 | 1401 | } |
028299c6 RS |
1402 | ; |
1403 | ||
1404 | notype_initdcl: | |
1405 | notype_declarator maybeasm maybe_attribute '=' | |
99ac47b5 | 1406 | { $<ttype>$ = start_decl ($1, current_declspecs, 1, |
4b01f8d8 | 1407 | chainon ($3, all_prefix_attributes)); |
6126f4db | 1408 | start_init ($<ttype>$, $2, global_bindings_p ()); } |
028299c6 RS |
1409 | init |
1410 | /* Note how the declaration of the variable is in effect while its init is parsed! */ | |
42e651a6 | 1411 | { finish_init (); |
6126f4db | 1412 | finish_decl ($<ttype>5, $6, $2); } |
028299c6 | 1413 | | notype_declarator maybeasm maybe_attribute |
99ac47b5 | 1414 | { tree d = start_decl ($1, current_declspecs, 0, |
4b01f8d8 | 1415 | chainon ($3, all_prefix_attributes)); |
028299c6 RS |
1416 | finish_decl (d, NULL_TREE, $2); } |
1417 | ; | |
1418 | /* the * rules are dummies to accept the Apollo extended syntax | |
1419 | so that the header files compile. */ | |
1420 | maybe_attribute: | |
660b43c8 | 1421 | /* empty */ |
c14bc6db | 1422 | { $$ = NULL_TREE; } |
660b43c8 RK |
1423 | | attributes |
1424 | { $$ = $1; } | |
1425 | ; | |
84d901be | 1426 | |
660b43c8 RK |
1427 | attributes: |
1428 | attribute | |
1429 | { $$ = $1; } | |
1430 | | attributes attribute | |
1431 | { $$ = chainon ($1, $2); } | |
1432 | ; | |
1433 | ||
1434 | attribute: | |
21526606 EC |
1435 | ATTRIBUTE stop_string_translation |
1436 | '(' '(' attribute_list ')' ')' start_string_translation | |
1437 | { $$ = $5; } | |
1438 | | ATTRIBUTE error start_string_translation | |
1439 | {} | |
660b43c8 RK |
1440 | ; |
1441 | ||
1442 | attribute_list: | |
1443 | attrib | |
5d7a33dc | 1444 | { $$ = $1; } |
660b43c8 | 1445 | | attribute_list ',' attrib |
5d7a33dc | 1446 | { $$ = chainon ($1, $3); } |
660b43c8 | 1447 | ; |
84d901be | 1448 | |
660b43c8 | 1449 | attrib: |
028299c6 RS |
1450 | /* empty */ |
1451 | { $$ = NULL_TREE; } | |
660b43c8 | 1452 | | any_word |
5d7a33dc | 1453 | { $$ = build_tree_list ($1, NULL_TREE); } |
660b43c8 | 1454 | | any_word '(' IDENTIFIER ')' |
5d7a33dc | 1455 | { $$ = build_tree_list ($1, build_tree_list (NULL_TREE, $3)); } |
660b43c8 | 1456 | | any_word '(' IDENTIFIER ',' nonnull_exprlist ')' |
5d7a33dc | 1457 | { $$ = build_tree_list ($1, tree_cons (NULL_TREE, $3, $5)); } |
f365e8f6 | 1458 | | any_word '(' exprlist ')' |
5d7a33dc | 1459 | { $$ = build_tree_list ($1, $3); } |
660b43c8 RK |
1460 | ; |
1461 | ||
1462 | /* This still leaves out most reserved keywords, | |
1463 | shouldn't we include them? */ | |
1464 | ||
1465 | any_word: | |
1466 | identifier | |
f79f2651 | 1467 | | scspec |
660b43c8 RK |
1468 | | TYPESPEC |
1469 | | TYPE_QUAL | |
1470 | ; | |
f79f2651 NB |
1471 | |
1472 | scspec: | |
1473 | STATIC | |
1474 | | SCSPEC | |
1475 | ; | |
42e651a6 RS |
1476 | \f |
1477 | /* Initializers. `init' is the entry point. */ | |
028299c6 RS |
1478 | |
1479 | init: | |
1480 | expr_no_commas | |
42e651a6 | 1481 | | '{' |
4dd7201e | 1482 | { really_start_incremental_init (NULL_TREE); } |
42e651a6 | 1483 | initlist_maybe_comma '}' |
4dd7201e | 1484 | { $$ = pop_init_level (0); } |
028299c6 | 1485 | | error |
e1eb754f | 1486 | { $$ = error_mark_node; } |
028299c6 RS |
1487 | ; |
1488 | ||
42e651a6 RS |
1489 | /* `initlist_maybe_comma' is the guts of an initializer in braces. */ |
1490 | initlist_maybe_comma: | |
1491 | /* empty */ | |
1492 | { if (pedantic) | |
89abf8d1 | 1493 | pedwarn ("ISO C forbids empty initializer braces"); } |
42e651a6 RS |
1494 | | initlist1 maybecomma |
1495 | ; | |
1496 | ||
1497 | initlist1: | |
1498 | initelt | |
1499 | | initlist1 ',' initelt | |
1500 | ; | |
1501 | ||
1502 | /* `initelt' is a single element of an initializer. | |
1503 | It may use braces. */ | |
1504 | initelt: | |
6f4d7222 | 1505 | designator_list '=' initval |
26d4fec7 | 1506 | { if (pedantic && ! flag_isoc99) |
b46b8fb4 | 1507 | pedwarn ("ISO C90 forbids specifying subobject to initialize"); } |
6f4d7222 | 1508 | | designator initval |
26d4fec7 JM |
1509 | { if (pedantic) |
1510 | pedwarn ("obsolete use of designated initializer without `='"); } | |
6f4d7222 | 1511 | | identifier ':' |
26d4fec7 JM |
1512 | { set_init_label ($1); |
1513 | if (pedantic) | |
1514 | pedwarn ("obsolete use of designated initializer with `:'"); } | |
6f4d7222 | 1515 | initval |
84d901be | 1516 | {} |
6f4d7222 UD |
1517 | | initval |
1518 | ; | |
1519 | ||
1520 | initval: | |
1521 | '{' | |
42e651a6 RS |
1522 | { push_init_level (0); } |
1523 | initlist_maybe_comma '}' | |
1524 | { process_init_element (pop_init_level (0)); } | |
6f4d7222 UD |
1525 | | expr_no_commas |
1526 | { process_init_element ($1); } | |
42e651a6 | 1527 | | error |
6f4d7222 UD |
1528 | ; |
1529 | ||
1530 | designator_list: | |
1531 | designator | |
1532 | | designator_list designator | |
1533 | ; | |
1534 | ||
1535 | designator: | |
1536 | '.' identifier | |
1537 | { set_init_label ($2); } | |
6f4d7222 | 1538 | | '[' expr_no_commas ELLIPSIS expr_no_commas ']' |
26d4fec7 JM |
1539 | { set_init_index ($2, $4); |
1540 | if (pedantic) | |
1541 | pedwarn ("ISO C forbids specifying range of elements to initialize"); } | |
a78bdb8e RK |
1542 | | '[' expr_no_commas ']' |
1543 | { set_init_index ($2, NULL_TREE); } | |
028299c6 | 1544 | ; |
42e651a6 | 1545 | \f |
028299c6 | 1546 | nested_function: |
9fe9dd86 | 1547 | declarator |
e2ecd91c | 1548 | { if (pedantic) |
89abf8d1 | 1549 | pedwarn ("ISO C forbids nested functions"); |
e2ecd91c BS |
1550 | |
1551 | push_function_context (); | |
ee7d912e | 1552 | if (! start_function (current_declspecs, $1, |
4b01f8d8 | 1553 | all_prefix_attributes)) |
028299c6 | 1554 | { |
e2ecd91c | 1555 | pop_function_context (); |
028299c6 RS |
1556 | YYERROR1; |
1557 | } | |
622d3731 | 1558 | parsing_iso_function_signature = false; /* Don't warn about nested functions. */ |
0e5921e8 | 1559 | } |
374a4e6c | 1560 | old_style_parm_decls save_location |
b190f239 | 1561 | { tree decl = current_function_decl; |
f31686a3 | 1562 | DECL_SOURCE_LOCATION (decl) = $4; |
b190f239 | 1563 | store_parm_decls (); } |
028299c6 RS |
1564 | /* This used to use compstmt_or_error. |
1565 | That caused a bug with input `f(g) int g {}', | |
1566 | where the use of YYERROR1 above caused an error | |
1567 | which then was handled by compstmt_or_error. | |
1568 | There followed a repeated execution of that same rule, | |
1569 | which called YYERROR1 again, and so on. */ | |
b190f239 | 1570 | compstmt |
8f17b5c5 | 1571 | { tree decl = current_function_decl; |
4a46cbfb | 1572 | finish_function (); |
84d901be | 1573 | pop_function_context (); |
8f17b5c5 | 1574 | add_decl_stmt (decl); } |
028299c6 RS |
1575 | ; |
1576 | ||
1577 | notype_nested_function: | |
9fe9dd86 | 1578 | notype_declarator |
e2ecd91c | 1579 | { if (pedantic) |
89abf8d1 | 1580 | pedwarn ("ISO C forbids nested functions"); |
e2ecd91c BS |
1581 | |
1582 | push_function_context (); | |
ee7d912e | 1583 | if (! start_function (current_declspecs, $1, |
4b01f8d8 | 1584 | all_prefix_attributes)) |
028299c6 | 1585 | { |
e2ecd91c | 1586 | pop_function_context (); |
028299c6 RS |
1587 | YYERROR1; |
1588 | } | |
622d3731 | 1589 | parsing_iso_function_signature = false; /* Don't warn about nested functions. */ |
0e5921e8 | 1590 | } |
374a4e6c | 1591 | old_style_parm_decls save_location |
b190f239 | 1592 | { tree decl = current_function_decl; |
f31686a3 | 1593 | DECL_SOURCE_LOCATION (decl) = $4; |
b190f239 | 1594 | store_parm_decls (); } |
028299c6 RS |
1595 | /* This used to use compstmt_or_error. |
1596 | That caused a bug with input `f(g) int g {}', | |
1597 | where the use of YYERROR1 above caused an error | |
1598 | which then was handled by compstmt_or_error. | |
1599 | There followed a repeated execution of that same rule, | |
1600 | which called YYERROR1 again, and so on. */ | |
b190f239 | 1601 | compstmt |
8f17b5c5 | 1602 | { tree decl = current_function_decl; |
4a46cbfb | 1603 | finish_function (); |
84d901be | 1604 | pop_function_context (); |
8f17b5c5 | 1605 | add_decl_stmt (decl); } |
028299c6 RS |
1606 | ; |
1607 | ||
1608 | /* Any kind of declarator (thus, all declarators allowed | |
1609 | after an explicit typespec). */ | |
1610 | ||
1611 | declarator: | |
1612 | after_type_declarator | |
1613 | | notype_declarator | |
1614 | ; | |
1615 | ||
1616 | /* A declarator that is allowed only after an explicit typespec. */ | |
1617 | ||
1618 | after_type_declarator: | |
91d231cb JM |
1619 | '(' maybe_attribute after_type_declarator ')' |
1620 | { $$ = $2 ? tree_cons ($2, $3, NULL_TREE) : $3; } | |
028299c6 RS |
1621 | | after_type_declarator '(' parmlist_or_identifiers %prec '.' |
1622 | { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } | |
1623 | /* | after_type_declarator '(' error ')' %prec '.' | |
1624 | { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); | |
1625 | poplevel (0, 0, 0); } */ | |
0e03329a JM |
1626 | | after_type_declarator array_declarator %prec '.' |
1627 | { $$ = set_array_declarator_type ($2, $1, 0); } | |
91d231cb | 1628 | | '*' maybe_type_quals_attrs after_type_declarator %prec UNARY |
028299c6 RS |
1629 | { $$ = make_pointer_declarator ($2, $3); } |
1630 | | TYPENAME | |
264fa2db | 1631 | @@ifobjc |
e31c7eec | 1632 | | OBJECTNAME |
264fa2db | 1633 | @@end_ifobjc |
028299c6 RS |
1634 | ; |
1635 | ||
1636 | /* Kinds of declarator that can appear in a parameter list | |
1637 | in addition to notype_declarator. This is like after_type_declarator | |
1638 | but does not allow a typedef name in parentheses as an identifier | |
1639 | (because it would conflict with a function with that typedef as arg). */ | |
028299c6 | 1640 | parm_declarator: |
97d24516 JM |
1641 | parm_declarator_starttypename |
1642 | | parm_declarator_nostarttypename | |
1643 | ; | |
1644 | ||
1645 | parm_declarator_starttypename: | |
1646 | parm_declarator_starttypename '(' parmlist_or_identifiers %prec '.' | |
028299c6 | 1647 | { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } |
97d24516 | 1648 | /* | parm_declarator_starttypename '(' error ')' %prec '.' |
028299c6 RS |
1649 | { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); |
1650 | poplevel (0, 0, 0); } */ | |
0e03329a JM |
1651 | | parm_declarator_starttypename array_declarator %prec '.' |
1652 | { $$ = set_array_declarator_type ($2, $1, 0); } | |
028299c6 | 1653 | | TYPENAME |
264fa2db | 1654 | @@ifobjc |
f2e6e530 | 1655 | | OBJECTNAME |
264fa2db | 1656 | @@end_ifobjc |
028299c6 RS |
1657 | ; |
1658 | ||
97d24516 JM |
1659 | parm_declarator_nostarttypename: |
1660 | parm_declarator_nostarttypename '(' parmlist_or_identifiers %prec '.' | |
1661 | { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } | |
1662 | /* | parm_declarator_nostarttypename '(' error ')' %prec '.' | |
1663 | { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); | |
1664 | poplevel (0, 0, 0); } */ | |
0e03329a JM |
1665 | | parm_declarator_nostarttypename array_declarator %prec '.' |
1666 | { $$ = set_array_declarator_type ($2, $1, 0); } | |
91d231cb | 1667 | | '*' maybe_type_quals_attrs parm_declarator_starttypename %prec UNARY |
97d24516 | 1668 | { $$ = make_pointer_declarator ($2, $3); } |
91d231cb | 1669 | | '*' maybe_type_quals_attrs parm_declarator_nostarttypename %prec UNARY |
97d24516 | 1670 | { $$ = make_pointer_declarator ($2, $3); } |
91d231cb JM |
1671 | | '(' maybe_attribute parm_declarator_nostarttypename ')' |
1672 | { $$ = $2 ? tree_cons ($2, $3, NULL_TREE) : $3; } | |
97d24516 JM |
1673 | ; |
1674 | ||
028299c6 RS |
1675 | /* A declarator allowed whether or not there has been |
1676 | an explicit typespec. These cannot redeclare a typedef-name. */ | |
1677 | ||
1678 | notype_declarator: | |
1679 | notype_declarator '(' parmlist_or_identifiers %prec '.' | |
1680 | { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } | |
1681 | /* | notype_declarator '(' error ')' %prec '.' | |
1682 | { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); | |
1683 | poplevel (0, 0, 0); } */ | |
91d231cb JM |
1684 | | '(' maybe_attribute notype_declarator ')' |
1685 | { $$ = $2 ? tree_cons ($2, $3, NULL_TREE) : $3; } | |
1686 | | '*' maybe_type_quals_attrs notype_declarator %prec UNARY | |
028299c6 | 1687 | { $$ = make_pointer_declarator ($2, $3); } |
0e03329a JM |
1688 | | notype_declarator array_declarator %prec '.' |
1689 | { $$ = set_array_declarator_type ($2, $1, 0); } | |
028299c6 RS |
1690 | | IDENTIFIER |
1691 | ; | |
1692 | ||
4051959b JM |
1693 | struct_head: |
1694 | STRUCT | |
1695 | { $$ = NULL_TREE; } | |
1696 | | STRUCT attributes | |
1697 | { $$ = $2; } | |
1698 | ; | |
1699 | ||
1700 | union_head: | |
1701 | UNION | |
1702 | { $$ = NULL_TREE; } | |
1703 | | UNION attributes | |
1704 | { $$ = $2; } | |
1705 | ; | |
1706 | ||
1707 | enum_head: | |
1708 | ENUM | |
1709 | { $$ = NULL_TREE; } | |
1710 | | ENUM attributes | |
1711 | { $$ = $2; } | |
1712 | ; | |
1713 | ||
25d78ace JM |
1714 | /* structsp_attr: struct/union/enum specifiers that either |
1715 | end with attributes, or are such that any following attributes would | |
1716 | be parsed as part of the struct/union/enum specifier. | |
1717 | ||
1718 | structsp_nonattr: other struct/union/enum specifiers. */ | |
1719 | ||
1720 | structsp_attr: | |
4051959b | 1721 | struct_head identifier '{' |
028299c6 RS |
1722 | { $$ = start_struct (RECORD_TYPE, $2); |
1723 | /* Start scope of tag before parsing components. */ | |
1724 | } | |
84d901be | 1725 | component_decl_list '}' maybe_attribute |
66ea6f4c RH |
1726 | { $$ = finish_struct ($<ttype>4, nreverse ($5), |
1727 | chainon ($1, $7)); } | |
4051959b | 1728 | | struct_head '{' component_decl_list '}' maybe_attribute |
028299c6 | 1729 | { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), |
66ea6f4c | 1730 | nreverse ($3), chainon ($1, $5)); |
5d7a33dc | 1731 | } |
4051959b | 1732 | | union_head identifier '{' |
028299c6 | 1733 | { $$ = start_struct (UNION_TYPE, $2); } |
5d7a33dc | 1734 | component_decl_list '}' maybe_attribute |
66ea6f4c RH |
1735 | { $$ = finish_struct ($<ttype>4, nreverse ($5), |
1736 | chainon ($1, $7)); } | |
4051959b | 1737 | | union_head '{' component_decl_list '}' maybe_attribute |
028299c6 | 1738 | { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE), |
66ea6f4c | 1739 | nreverse ($3), chainon ($1, $5)); |
af6f30c4 | 1740 | } |
4051959b | 1741 | | enum_head identifier '{' |
4dd7201e | 1742 | { $$ = start_enum ($2); } |
41ddaaa4 | 1743 | enumlist maybecomma_warn '}' maybe_attribute |
4dd7201e ZW |
1744 | { $$ = finish_enum ($<ttype>4, nreverse ($5), |
1745 | chainon ($1, $8)); } | |
4051959b | 1746 | | enum_head '{' |
4dd7201e | 1747 | { $$ = start_enum (NULL_TREE); } |
41ddaaa4 | 1748 | enumlist maybecomma_warn '}' maybe_attribute |
4dd7201e ZW |
1749 | { $$ = finish_enum ($<ttype>3, nreverse ($4), |
1750 | chainon ($1, $7)); } | |
25d78ace JM |
1751 | ; |
1752 | ||
1753 | structsp_nonattr: | |
1754 | struct_head identifier | |
1755 | { $$ = xref_tag (RECORD_TYPE, $2); } | |
1756 | | union_head identifier | |
1757 | { $$ = xref_tag (UNION_TYPE, $2); } | |
4051959b | 1758 | | enum_head identifier |
0aca1a4f JM |
1759 | { $$ = xref_tag (ENUMERAL_TYPE, $2); |
1760 | /* In ISO C, enumerated types can be referred to | |
1761 | only if already defined. */ | |
1762 | if (pedantic && !COMPLETE_TYPE_P ($$)) | |
1763 | pedwarn ("ISO C forbids forward references to `enum' types"); } | |
028299c6 RS |
1764 | ; |
1765 | ||
1766 | maybecomma: | |
1767 | /* empty */ | |
1768 | | ',' | |
1769 | ; | |
1770 | ||
1771 | maybecomma_warn: | |
1772 | /* empty */ | |
1773 | | ',' | |
b919445a | 1774 | { if (pedantic && ! flag_isoc99) |
6f4d7222 | 1775 | pedwarn ("comma at end of enumerator list"); } |
028299c6 RS |
1776 | ; |
1777 | ||
66ea6f4c RH |
1778 | /* We chain the components in reverse order. They are put in forward |
1779 | order in structsp_attr. | |
1780 | ||
1781 | Note that component_declarator returns single decls, so components | |
1782 | and components_notype can use TREE_CHAIN directly, wheras components | |
1783 | and components_notype return lists (of comma separated decls), so | |
1784 | component_decl_list and component_decl_list2 must use chainon. | |
1785 | ||
1786 | The theory behind all this is that there will be more semicolon | |
1787 | separated fields than comma separated fields, and so we'll be | |
1788 | minimizing the number of node traversals required by chainon. */ | |
1789 | ||
028299c6 RS |
1790 | component_decl_list: |
1791 | component_decl_list2 | |
1792 | { $$ = $1; } | |
1793 | | component_decl_list2 component_decl | |
66ea6f4c | 1794 | { $$ = chainon ($2, $1); |
ee759b21 | 1795 | pedwarn ("no semicolon at end of struct or union"); } |
028299c6 RS |
1796 | ; |
1797 | ||
1798 | component_decl_list2: /* empty */ | |
1799 | { $$ = NULL_TREE; } | |
1800 | | component_decl_list2 component_decl ';' | |
66ea6f4c | 1801 | { $$ = chainon ($2, $1); } |
028299c6 RS |
1802 | | component_decl_list2 ';' |
1803 | { if (pedantic) | |
1804 | pedwarn ("extra semicolon in struct or union specified"); } | |
264fa2db | 1805 | @@ifobjc |
028299c6 RS |
1806 | /* foo(sizeof(struct{ @defs(ClassName)})); */ |
1807 | | DEFS '(' CLASSNAME ')' | |
264fa2db ZL |
1808 | { $$ = nreverse (get_class_ivars_from_name ($3)); } |
1809 | @@end_ifobjc | |
028299c6 RS |
1810 | ; |
1811 | ||
028299c6 | 1812 | component_decl: |
25d78ace | 1813 | declspecs_nosc_ts setspecs components |
028299c6 | 1814 | { $$ = $3; |
4b01f8d8 | 1815 | POP_DECLSPEC_STACK; } |
bc4721b8 | 1816 | | declspecs_nosc_ts setspecs |
ffc3b0f9 | 1817 | { |
84d901be AD |
1818 | /* Support for unnamed structs or unions as members of |
1819 | structs or unions (which is [a] useful and [b] supports | |
ffc3b0f9 AH |
1820 | MS P-SDK). */ |
1821 | if (pedantic) | |
89abf8d1 | 1822 | pedwarn ("ISO C doesn't support unnamed structs/unions"); |
ffc3b0f9 | 1823 | |
bc4721b8 | 1824 | $$ = grokfield(NULL, current_declspecs, NULL_TREE); |
4b01f8d8 | 1825 | POP_DECLSPEC_STACK; } |
25d78ace | 1826 | | declspecs_nosc_nots setspecs components_notype |
028299c6 | 1827 | { $$ = $3; |
4b01f8d8 | 1828 | POP_DECLSPEC_STACK; } |
25d78ace | 1829 | | declspecs_nosc_nots |
028299c6 | 1830 | { if (pedantic) |
89abf8d1 | 1831 | pedwarn ("ISO C forbids member declarations with no members"); |
eb1dfbb2 | 1832 | shadow_tag_warned ($1, pedantic); |
028299c6 RS |
1833 | $$ = NULL_TREE; } |
1834 | | error | |
1835 | { $$ = NULL_TREE; } | |
72acf258 JM |
1836 | | extension component_decl |
1837 | { $$ = $2; | |
750491fc | 1838 | RESTORE_EXT_FLAGS ($1); } |
028299c6 RS |
1839 | ; |
1840 | ||
1841 | components: | |
1842 | component_declarator | |
4b01f8d8 | 1843 | | components ',' maybe_resetattrs component_declarator |
66ea6f4c | 1844 | { TREE_CHAIN ($4) = $1; $$ = $4; } |
25d78ace JM |
1845 | ; |
1846 | ||
1847 | components_notype: | |
1848 | component_notype_declarator | |
4b01f8d8 | 1849 | | components_notype ',' maybe_resetattrs component_notype_declarator |
66ea6f4c | 1850 | { TREE_CHAIN ($4) = $1; $$ = $4; } |
028299c6 RS |
1851 | ; |
1852 | ||
1853 | component_declarator: | |
bc4721b8 NS |
1854 | declarator maybe_attribute |
1855 | { $$ = grokfield ($1, current_declspecs, NULL_TREE); | |
1856 | decl_attributes (&$$, | |
1857 | chainon ($2, all_prefix_attributes), 0); } | |
1858 | | declarator ':' expr_no_commas maybe_attribute | |
1859 | { $$ = grokfield ($1, current_declspecs, $3); | |
1860 | decl_attributes (&$$, | |
1861 | chainon ($4, all_prefix_attributes), 0); } | |
1862 | | ':' expr_no_commas maybe_attribute | |
1863 | { $$ = grokfield (NULL_TREE, current_declspecs, $2); | |
1864 | decl_attributes (&$$, | |
1865 | chainon ($3, all_prefix_attributes), 0); } | |
028299c6 RS |
1866 | ; |
1867 | ||
25d78ace | 1868 | component_notype_declarator: |
bc4721b8 NS |
1869 | notype_declarator maybe_attribute |
1870 | { $$ = grokfield ($1, current_declspecs, NULL_TREE); | |
1871 | decl_attributes (&$$, | |
1872 | chainon ($2, all_prefix_attributes), 0); } | |
1873 | | notype_declarator ':' expr_no_commas maybe_attribute | |
1874 | { $$ = grokfield ($1, current_declspecs, $3); | |
1875 | decl_attributes (&$$, | |
1876 | chainon ($4, all_prefix_attributes), 0); } | |
1877 | | ':' expr_no_commas maybe_attribute | |
1878 | { $$ = grokfield (NULL_TREE, current_declspecs, $2); | |
1879 | decl_attributes (&$$, | |
1880 | chainon ($3, all_prefix_attributes), 0); } | |
25d78ace JM |
1881 | ; |
1882 | ||
028299c6 | 1883 | /* We chain the enumerators in reverse order. |
66ea6f4c | 1884 | They are put in forward order in structsp_attr. */ |
028299c6 RS |
1885 | |
1886 | enumlist: | |
1887 | enumerator | |
1888 | | enumlist ',' enumerator | |
a0d074e1 RK |
1889 | { if ($1 == error_mark_node) |
1890 | $$ = $1; | |
1891 | else | |
66ea6f4c | 1892 | TREE_CHAIN ($3) = $1, $$ = $3; } |
adc3b521 RS |
1893 | | error |
1894 | { $$ = error_mark_node; } | |
028299c6 RS |
1895 | ; |
1896 | ||
1897 | ||
1898 | enumerator: | |
1899 | identifier | |
1900 | { $$ = build_enumerator ($1, NULL_TREE); } | |
1901 | | identifier '=' expr_no_commas | |
1902 | { $$ = build_enumerator ($1, $3); } | |
1903 | ; | |
1904 | ||
1905 | typename: | |
25d78ace | 1906 | declspecs_nosc |
d3b4cd6f AH |
1907 | { pending_xref_error (); |
1908 | $<ttype>$ = $1; } | |
0aca1a4f | 1909 | absdcl |
25d78ace | 1910 | { $$ = build_tree_list ($<ttype>2, $3); } |
028299c6 RS |
1911 | ; |
1912 | ||
1913 | absdcl: /* an absolute declarator */ | |
1914 | /* empty */ | |
1915 | { $$ = NULL_TREE; } | |
1916 | | absdcl1 | |
1917 | ; | |
1918 | ||
25d78ace JM |
1919 | absdcl_maybe_attribute: /* absdcl maybe_attribute, but not just attributes */ |
1920 | /* empty */ | |
1921 | { $$ = build_tree_list (build_tree_list (current_declspecs, | |
1922 | NULL_TREE), | |
4b01f8d8 | 1923 | all_prefix_attributes); } |
25d78ace JM |
1924 | | absdcl1 |
1925 | { $$ = build_tree_list (build_tree_list (current_declspecs, | |
1926 | $1), | |
4b01f8d8 | 1927 | all_prefix_attributes); } |
25d78ace JM |
1928 | | absdcl1_noea attributes |
1929 | { $$ = build_tree_list (build_tree_list (current_declspecs, | |
1930 | $1), | |
4b01f8d8 | 1931 | chainon ($2, all_prefix_attributes)); } |
028299c6 RS |
1932 | ; |
1933 | ||
25d78ace JM |
1934 | absdcl1: /* a nonempty absolute declarator */ |
1935 | absdcl1_ea | |
1936 | | absdcl1_noea | |
028299c6 RS |
1937 | ; |
1938 | ||
25d78ace JM |
1939 | absdcl1_noea: |
1940 | direct_absdcl1 | |
91d231cb | 1941 | | '*' maybe_type_quals_attrs absdcl1_noea |
028299c6 | 1942 | { $$ = make_pointer_declarator ($2, $3); } |
25d78ace JM |
1943 | ; |
1944 | ||
1945 | absdcl1_ea: | |
91d231cb | 1946 | '*' maybe_type_quals_attrs |
028299c6 | 1947 | { $$ = make_pointer_declarator ($2, NULL_TREE); } |
91d231cb | 1948 | | '*' maybe_type_quals_attrs absdcl1_ea |
25d78ace JM |
1949 | { $$ = make_pointer_declarator ($2, $3); } |
1950 | ; | |
1951 | ||
1952 | direct_absdcl1: | |
91d231cb JM |
1953 | '(' maybe_attribute absdcl1 ')' |
1954 | { $$ = $2 ? tree_cons ($2, $3, NULL_TREE) : $3; } | |
25d78ace | 1955 | | direct_absdcl1 '(' parmlist |
028299c6 | 1956 | { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } |
0e03329a JM |
1957 | | direct_absdcl1 array_declarator |
1958 | { $$ = set_array_declarator_type ($2, $1, 1); } | |
25d78ace | 1959 | | '(' parmlist |
028299c6 | 1960 | { $$ = build_nt (CALL_EXPR, NULL_TREE, $2, NULL_TREE); } |
0e03329a JM |
1961 | | array_declarator |
1962 | { $$ = set_array_declarator_type ($1, NULL_TREE, 1); } | |
1963 | ; | |
1964 | ||
1965 | /* The [...] part of a declarator for an array type. */ | |
1966 | ||
1967 | array_declarator: | |
88682ff6 | 1968 | '[' maybe_type_quals_attrs expr_no_commas ']' |
0e03329a | 1969 | { $$ = build_array_declarator ($3, $2, 0, 0); } |
f79f2651 | 1970 | | '[' maybe_type_quals_attrs ']' |
0e03329a | 1971 | { $$ = build_array_declarator (NULL_TREE, $2, 0, 0); } |
f79f2651 | 1972 | | '[' maybe_type_quals_attrs '*' ']' |
0e03329a | 1973 | { $$ = build_array_declarator (NULL_TREE, $2, 0, 1); } |
88682ff6 | 1974 | | '[' STATIC maybe_type_quals_attrs expr_no_commas ']' |
f79f2651 NB |
1975 | { $$ = build_array_declarator ($4, $3, 1, 0); } |
1976 | /* declspecs_nosc_nots is a synonym for type_quals_attrs. */ | |
88682ff6 | 1977 | | '[' declspecs_nosc_nots STATIC expr_no_commas ']' |
f79f2651 | 1978 | { $$ = build_array_declarator ($4, $2, 1, 0); } |
0e03329a | 1979 | ; |
028299c6 | 1980 | |
b7438415 JM |
1981 | /* A nonempty series of declarations and statements (possibly followed by |
1982 | some labels) that can form the body of a compound statement. | |
1983 | NOTE: we don't allow labels on declarations; this might seem like a | |
1984 | natural extension, but there would be a conflict between attributes | |
1985 | on the label and prefix attributes on the declaration. */ | |
028299c6 | 1986 | |
b7438415 JM |
1987 | stmts_and_decls: |
1988 | lineno_stmt_decl_or_labels_ending_stmt | |
1989 | | lineno_stmt_decl_or_labels_ending_decl | |
1990 | | lineno_stmt_decl_or_labels_ending_label | |
28a19afc | 1991 | { |
f560bf91 | 1992 | error ("label at end of compound statement"); |
28a19afc | 1993 | } |
b7438415 | 1994 | | lineno_stmt_decl_or_labels_ending_error |
28a19afc RK |
1995 | ; |
1996 | ||
b7438415 JM |
1997 | lineno_stmt_decl_or_labels_ending_stmt: |
1998 | lineno_stmt | |
1999 | | lineno_stmt_decl_or_labels_ending_stmt lineno_stmt | |
2000 | | lineno_stmt_decl_or_labels_ending_decl lineno_stmt | |
2001 | | lineno_stmt_decl_or_labels_ending_label lineno_stmt | |
2002 | | lineno_stmt_decl_or_labels_ending_error lineno_stmt | |
028299c6 RS |
2003 | ; |
2004 | ||
b7438415 JM |
2005 | lineno_stmt_decl_or_labels_ending_decl: |
2006 | lineno_decl | |
2007 | | lineno_stmt_decl_or_labels_ending_stmt lineno_decl | |
85617eba HPN |
2008 | { |
2009 | if ((pedantic && !flag_isoc99) | |
2010 | || warn_declaration_after_statement) | |
2011 | pedwarn_c90 ("ISO C90 forbids mixed declarations and code"); | |
2012 | } | |
b7438415 JM |
2013 | | lineno_stmt_decl_or_labels_ending_decl lineno_decl |
2014 | | lineno_stmt_decl_or_labels_ending_error lineno_decl | |
2015 | ; | |
2016 | ||
2017 | lineno_stmt_decl_or_labels_ending_label: | |
2018 | lineno_label | |
2019 | | lineno_stmt_decl_or_labels_ending_stmt lineno_label | |
2020 | | lineno_stmt_decl_or_labels_ending_decl lineno_label | |
2021 | | lineno_stmt_decl_or_labels_ending_label lineno_label | |
2022 | | lineno_stmt_decl_or_labels_ending_error lineno_label | |
2023 | ; | |
2024 | ||
2025 | lineno_stmt_decl_or_labels_ending_error: | |
2026 | errstmt | |
2027 | | lineno_stmt_decl_or_labels errstmt | |
2028 | ; | |
2029 | ||
2030 | lineno_stmt_decl_or_labels: | |
2031 | lineno_stmt_decl_or_labels_ending_stmt | |
2032 | | lineno_stmt_decl_or_labels_ending_decl | |
2033 | | lineno_stmt_decl_or_labels_ending_label | |
2034 | | lineno_stmt_decl_or_labels_ending_error | |
028299c6 RS |
2035 | ; |
2036 | ||
2037 | errstmt: error ';' | |
2038 | ; | |
2039 | ||
2040 | pushlevel: /* empty */ | |
8f17b5c5 | 2041 | { pushlevel (0); |
028299c6 | 2042 | clear_last_expr (); |
8f17b5c5 | 2043 | add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0); |
028299c6 RS |
2044 | } |
2045 | ; | |
2046 | ||
8f17b5c5 | 2047 | poplevel: /* empty */ |
e13e48e7 | 2048 | { |
264fa2db ZL |
2049 | @@ifobjc |
2050 | if (c_dialect_objc ()) | |
2051 | objc_clear_super_receiver (); | |
2052 | @@end_ifobjc | |
e13e48e7 | 2053 | $$ = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); |
264fa2db | 2054 | } |
7d6f6369 | 2055 | ; |
8f17b5c5 | 2056 | |
444ca59f JM |
2057 | /* Start and end blocks created for the new scopes of C99. */ |
2058 | c99_block_start: /* empty */ | |
2059 | { if (flag_isoc99) | |
2060 | { | |
2061 | $$ = c_begin_compound_stmt (); | |
2062 | pushlevel (0); | |
2063 | clear_last_expr (); | |
2064 | add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0); | |
444ca59f JM |
2065 | } |
2066 | else | |
2067 | $$ = NULL_TREE; | |
2068 | } | |
2069 | ; | |
2070 | ||
2071 | /* Productions using c99_block_start and c99_block_end will need to do what's | |
2072 | in compstmt: RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); $$ = $2; where | |
2073 | $1 is the value of c99_block_start and $2 of c99_block_end. */ | |
2074 | c99_block_end: /* empty */ | |
2075 | { if (flag_isoc99) | |
2076 | { | |
2077 | tree scope_stmt = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); | |
9cd51ef6 | 2078 | $$ = poplevel (KEEP_MAYBE, 0, 0); |
84d901be | 2079 | SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt)) |
444ca59f JM |
2080 | = SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmt)) |
2081 | = $$; | |
2082 | } | |
2083 | else | |
2084 | $$ = NULL_TREE; } | |
2085 | ; | |
2086 | ||
028299c6 RS |
2087 | /* Read zero or more forward-declarations for labels |
2088 | that nested functions can jump to. */ | |
2089 | maybe_label_decls: | |
2090 | /* empty */ | |
2091 | | label_decls | |
2092 | { if (pedantic) | |
89abf8d1 | 2093 | pedwarn ("ISO C forbids label declarations"); } |
028299c6 RS |
2094 | ; |
2095 | ||
2096 | label_decls: | |
2097 | label_decl | |
2098 | | label_decls label_decl | |
2099 | ; | |
2100 | ||
2101 | label_decl: | |
2102 | LABEL identifiers_or_typenames ';' | |
2103 | { tree link; | |
2104 | for (link = $2; link; link = TREE_CHAIN (link)) | |
2105 | { | |
14e33ee8 | 2106 | tree label = declare_label (TREE_VALUE (link)); |
028299c6 | 2107 | C_DECLARED_LABEL_FLAG (label) = 1; |
8f17b5c5 | 2108 | add_decl_stmt (label); |
028299c6 RS |
2109 | } |
2110 | } | |
2111 | ; | |
2112 | ||
2113 | /* This is the body of a function definition. | |
2114 | It causes syntax errors to ignore to the next openbrace. */ | |
2115 | compstmt_or_error: | |
2116 | compstmt | |
2117 | {} | |
2118 | | error compstmt | |
2119 | ; | |
2120 | ||
8f17b5c5 | 2121 | compstmt_start: '{' { compstmt_count++; |
7d6f6369 PC |
2122 | $$ = c_begin_compound_stmt (); } |
2123 | ; | |
818e50a5 | 2124 | |
d0668a73 | 2125 | compstmt_nostart: '}' |
028299c6 | 2126 | { $$ = convert (void_type_node, integer_zero_node); } |
b7438415 | 2127 | | pushlevel maybe_label_decls compstmt_contents_nonempty '}' poplevel |
f91f41b2 | 2128 | { $$ = poplevel (KEEP_MAYBE, 0, 0); |
84d901be | 2129 | SCOPE_STMT_BLOCK (TREE_PURPOSE ($5)) |
8f17b5c5 MM |
2130 | = SCOPE_STMT_BLOCK (TREE_VALUE ($5)) |
2131 | = $$; } | |
028299c6 RS |
2132 | ; |
2133 | ||
b7438415 JM |
2134 | compstmt_contents_nonempty: |
2135 | stmts_and_decls | |
2136 | | error | |
2137 | ; | |
2138 | ||
d0668a73 RH |
2139 | compstmt_primary_start: |
2140 | '(' '{' | |
2141 | { if (current_function_decl == 0) | |
2142 | { | |
2143 | error ("braced-group within expression allowed only inside a function"); | |
2144 | YYERROR; | |
2145 | } | |
2146 | /* We must force a BLOCK for this level | |
2147 | so that, if it is not expanded later, | |
2148 | there is a way to turn off the entire subtree of blocks | |
2149 | that are contained in it. */ | |
2150 | keep_next_level (); | |
d0668a73 | 2151 | compstmt_count++; |
8f17b5c5 | 2152 | $$ = add_stmt (build_stmt (COMPOUND_STMT, last_tree)); |
d0668a73 | 2153 | } |
7d6f6369 | 2154 | ; |
d0668a73 RH |
2155 | |
2156 | compstmt: compstmt_start compstmt_nostart | |
84d901be | 2157 | { RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); |
1cf537c5 | 2158 | last_expr_type = NULL_TREE; |
64094f6a | 2159 | $$ = $1; } |
d0668a73 RH |
2160 | ; |
2161 | ||
028299c6 RS |
2162 | /* Value is number of statements counted as of the closeparen. */ |
2163 | simple_if: | |
444ca59f | 2164 | if_prefix c99_block_lineno_labeled_stmt |
8f17b5c5 | 2165 | { c_finish_then (); } |
818e50a5 JL |
2166 | /* Make sure c_expand_end_cond is run once |
2167 | for each call to c_expand_start_cond. | |
028299c6 RS |
2168 | Otherwise a crash is likely. */ |
2169 | | if_prefix error | |
2170 | ; | |
2171 | ||
2172 | if_prefix: | |
c1e14513 JL |
2173 | /* We must build the IF_STMT node before parsing its |
2174 | condition so that STMT_LINENO refers to the line | |
2175 | containing the "if", and not the line containing | |
2176 | the close-parenthesis. | |
2177 | ||
2178 | c_begin_if_stmt returns the IF_STMT node, which | |
2179 | we later pass to c_expand_start_cond to fill | |
2180 | in the condition and other tidbits. */ | |
2181 | IF | |
2182 | { $<ttype>$ = c_begin_if_stmt (); } | |
2183 | '(' expr ')' | |
e57e265b | 2184 | { c_expand_start_cond ((*lang_hooks.truthvalue_conversion) ($4), |
c1e14513 | 2185 | compstmt_count,$<ttype>2); |
7f3d4b2f | 2186 | $<itype>$ = stmt_count; |
374a4e6c | 2187 | if_stmt_locus = $<location>-1; } |
c1e14513 | 2188 | ; |
028299c6 RS |
2189 | |
2190 | /* This is a subroutine of stmt. | |
2191 | It is used twice, once for valid DO statements | |
2192 | and once for catching errors in parsing the end test. */ | |
2193 | do_stmt_start: | |
2194 | DO | |
2195 | { stmt_count++; | |
818e50a5 | 2196 | compstmt_count++; |
e13e48e7 | 2197 | c_in_iteration_stmt++; |
84d901be | 2198 | $<ttype>$ |
8f17b5c5 MM |
2199 | = add_stmt (build_stmt (DO_STMT, NULL_TREE, |
2200 | NULL_TREE)); | |
2201 | /* In the event that a parse error prevents | |
2202 | parsing the complete do-statement, set the | |
2203 | condition now. Otherwise, we can get crashes at | |
2204 | RTL-generation time. */ | |
2205 | DO_COND ($<ttype>$) = error_mark_node; } | |
444ca59f | 2206 | c99_block_lineno_labeled_stmt WHILE |
8f17b5c5 | 2207 | { $$ = $<ttype>2; |
e13e48e7 EC |
2208 | RECHAIN_STMTS ($$, DO_BODY ($$)); |
2209 | c_in_iteration_stmt--; } | |
028299c6 RS |
2210 | ; |
2211 | ||
0e5921e8 ZW |
2212 | /* The forced readahead in here is because we might be at the end of a |
2213 | line, and the line and file won't be bumped until yylex absorbs the | |
2214 | first token on the next line. */ | |
028299c6 | 2215 | |
374a4e6c | 2216 | save_location: |
0e5921e8 ZW |
2217 | { if (yychar == YYEMPTY) |
2218 | yychar = YYLEX; | |
374a4e6c | 2219 | $$ = input_location; } |
028299c6 RS |
2220 | ; |
2221 | ||
2222 | lineno_labeled_stmt: | |
64094f6a RH |
2223 | lineno_stmt |
2224 | | lineno_label lineno_labeled_stmt | |
028299c6 RS |
2225 | ; |
2226 | ||
444ca59f JM |
2227 | /* Like lineno_labeled_stmt, but a block in C99. */ |
2228 | c99_block_lineno_labeled_stmt: | |
2229 | c99_block_start lineno_labeled_stmt c99_block_end | |
2230 | { if (flag_isoc99) | |
2231 | RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); } | |
2232 | ; | |
2233 | ||
b7438415 | 2234 | lineno_stmt: |
374a4e6c NS |
2235 | save_location stmt |
2236 | { if ($2) | |
64094f6a | 2237 | { |
374a4e6c | 2238 | STMT_LINENO ($2) = $1.line; |
64094f6a RH |
2239 | /* ??? We currently have no way of recording |
2240 | the filename for a statement. This probably | |
2241 | matters little in practice at the moment, | |
ff7cc307 | 2242 | but I suspect that problems will occur when |
64094f6a RH |
2243 | doing inlining at the tree level. */ |
2244 | } | |
2245 | } | |
028299c6 RS |
2246 | ; |
2247 | ||
b7438415 | 2248 | lineno_label: |
374a4e6c NS |
2249 | save_location label |
2250 | { if ($2) | |
64094f6a | 2251 | { |
374a4e6c | 2252 | STMT_LINENO ($2) = $1.line; |
64094f6a RH |
2253 | } |
2254 | } | |
028299c6 RS |
2255 | ; |
2256 | ||
444ca59f JM |
2257 | select_or_iter_stmt: |
2258 | simple_if ELSE | |
818e50a5 | 2259 | { c_expand_start_else (); |
0e5921e8 | 2260 | $<itype>1 = stmt_count; } |
444ca59f | 2261 | c99_block_lineno_labeled_stmt |
8f17b5c5 MM |
2262 | { c_finish_else (); |
2263 | c_expand_end_cond (); | |
028299c6 RS |
2264 | if (extra_warnings && stmt_count == $<itype>1) |
2265 | warning ("empty body in an else-statement"); } | |
2266 | | simple_if %prec IF | |
818e50a5 | 2267 | { c_expand_end_cond (); |
7f3d4b2f JW |
2268 | /* This warning is here instead of in simple_if, because we |
2269 | do not want a warning if an empty if is followed by an | |
218d0f8a RK |
2270 | else statement. Increment stmt_count so we don't |
2271 | give a second error if this is a nested `if'. */ | |
2272 | if (extra_warnings && stmt_count++ == $<itype>1) | |
49468c8b GDR |
2273 | warning ("%Hempty body in an if-statement", |
2274 | &if_stmt_locus); } | |
818e50a5 JL |
2275 | /* Make sure c_expand_end_cond is run once |
2276 | for each call to c_expand_start_cond. | |
028299c6 RS |
2277 | Otherwise a crash is likely. */ |
2278 | | simple_if ELSE error | |
818e50a5 | 2279 | { c_expand_end_cond (); } |
c1e14513 JL |
2280 | /* We must build the WHILE_STMT node before parsing its |
2281 | condition so that STMT_LINENO refers to the line | |
2282 | containing the "while", and not the line containing | |
2283 | the close-parenthesis. | |
2284 | ||
2285 | c_begin_while_stmt returns the WHILE_STMT node, which | |
2286 | we later pass to c_finish_while_stmt_cond to fill | |
2287 | in the condition and other tidbits. */ | |
028299c6 | 2288 | | WHILE |
84d901be | 2289 | { stmt_count++; |
c1e14513 | 2290 | $<ttype>$ = c_begin_while_stmt (); } |
028299c6 | 2291 | '(' expr ')' |
e13e48e7 | 2292 | { c_in_iteration_stmt++; |
e57e265b | 2293 | $4 = (*lang_hooks.truthvalue_conversion) ($4); |
78ef5b89 | 2294 | c_finish_while_stmt_cond |
e57e265b | 2295 | ((*lang_hooks.truthvalue_conversion) ($4), $<ttype>2); |
c1e14513 | 2296 | $<ttype>$ = add_stmt ($<ttype>2); } |
444ca59f | 2297 | c99_block_lineno_labeled_stmt |
e13e48e7 EC |
2298 | { c_in_iteration_stmt--; |
2299 | RECHAIN_STMTS ($<ttype>6, WHILE_BODY ($<ttype>6)); } | |
028299c6 RS |
2300 | | do_stmt_start |
2301 | '(' expr ')' ';' | |
e57e265b | 2302 | { DO_COND ($1) = (*lang_hooks.truthvalue_conversion) ($3); } |
028299c6 | 2303 | | do_stmt_start error |
c14bc6db | 2304 | { } |
028299c6 | 2305 | | FOR |
77c4d6c0 | 2306 | { $<ttype>$ = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE, |
8f17b5c5 | 2307 | NULL_TREE, NULL_TREE); |
84d901be | 2308 | add_stmt ($<ttype>$); } |
77c4d6c0 JM |
2309 | '(' for_init_stmt |
2310 | { stmt_count++; | |
2311 | RECHAIN_STMTS ($<ttype>2, FOR_INIT_STMT ($<ttype>2)); } | |
028299c6 | 2312 | xexpr ';' |
84d901be | 2313 | { if ($6) |
78ef5b89 | 2314 | FOR_COND ($<ttype>2) |
e57e265b | 2315 | = (*lang_hooks.truthvalue_conversion) ($6); } |
028299c6 | 2316 | xexpr ')' |
e13e48e7 EC |
2317 | { c_in_iteration_stmt++; |
2318 | FOR_EXPR ($<ttype>2) = $9; } | |
444ca59f | 2319 | c99_block_lineno_labeled_stmt |
e13e48e7 EC |
2320 | { RECHAIN_STMTS ($<ttype>2, FOR_BODY ($<ttype>2)); |
2321 | c_in_iteration_stmt--;} | |
028299c6 RS |
2322 | | SWITCH '(' expr ')' |
2323 | { stmt_count++; | |
e13e48e7 EC |
2324 | $<ttype>$ = c_start_case ($3); |
2325 | c_in_case_stmt++; } | |
444ca59f | 2326 | c99_block_lineno_labeled_stmt |
e13e48e7 EC |
2327 | { c_finish_case (); |
2328 | c_in_case_stmt--; } | |
444ca59f JM |
2329 | ; |
2330 | ||
77c4d6c0 JM |
2331 | for_init_stmt: |
2332 | xexpr ';' | |
84d901be | 2333 | { add_stmt (build_stmt (EXPR_STMT, $1)); } |
77c4d6c0 JM |
2334 | | decl |
2335 | { check_for_loop_decls (); } | |
2336 | ; | |
2337 | ||
9f0e2d86 ZW |
2338 | xexpr: |
2339 | /* empty */ | |
2340 | { $$ = NULL_TREE; } | |
2341 | | expr | |
2342 | ; | |
2343 | ||
444ca59f JM |
2344 | /* Parse a single real statement, not including any labels. */ |
2345 | stmt: | |
2346 | compstmt | |
64094f6a | 2347 | { stmt_count++; $$ = $1; } |
444ca59f JM |
2348 | | expr ';' |
2349 | { stmt_count++; | |
64094f6a | 2350 | $$ = c_expand_expr_stmt ($1); } |
444ca59f JM |
2351 | | c99_block_start select_or_iter_stmt c99_block_end |
2352 | { if (flag_isoc99) | |
64094f6a RH |
2353 | RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); |
2354 | $$ = NULL_TREE; } | |
028299c6 | 2355 | | BREAK ';' |
8f17b5c5 | 2356 | { stmt_count++; |
e13e48e7 EC |
2357 | if (!(c_in_iteration_stmt || c_in_case_stmt)) |
2358 | { | |
2359 | error ("break statement not within loop or switch"); | |
2360 | $$ = NULL_TREE; | |
2361 | } | |
2362 | else | |
64094f6a | 2363 | $$ = add_stmt (build_break_stmt ()); } |
028299c6 | 2364 | | CONTINUE ';' |
8f17b5c5 | 2365 | { stmt_count++; |
e13e48e7 EC |
2366 | if (!c_in_iteration_stmt) |
2367 | { | |
2368 | error ("continue statement not within a loop"); | |
2369 | $$ = NULL_TREE; | |
2370 | } | |
2371 | else | |
64094f6a | 2372 | $$ = add_stmt (build_continue_stmt ()); } |
028299c6 | 2373 | | RETURN ';' |
56cb9733 | 2374 | { stmt_count++; |
64094f6a | 2375 | $$ = c_expand_return (NULL_TREE); } |
028299c6 | 2376 | | RETURN expr ';' |
56cb9733 | 2377 | { stmt_count++; |
64094f6a | 2378 | $$ = c_expand_return ($2); } |
9f0e2d86 | 2379 | | asm_stmt |
028299c6 RS |
2380 | | GOTO identifier ';' |
2381 | { tree decl; | |
2382 | stmt_count++; | |
028299c6 RS |
2383 | decl = lookup_label ($2); |
2384 | if (decl != 0) | |
2385 | { | |
2386 | TREE_USED (decl) = 1; | |
64094f6a | 2387 | $$ = add_stmt (build_stmt (GOTO_STMT, decl)); |
028299c6 | 2388 | } |
64094f6a RH |
2389 | else |
2390 | $$ = NULL_TREE; | |
028299c6 RS |
2391 | } |
2392 | | GOTO '*' expr ';' | |
e64bb706 | 2393 | { if (pedantic) |
89abf8d1 | 2394 | pedwarn ("ISO C forbids `goto *expr;'"); |
e64bb706 | 2395 | stmt_count++; |
8f17b5c5 | 2396 | $3 = convert (ptr_type_node, $3); |
64094f6a | 2397 | $$ = add_stmt (build_stmt (GOTO_STMT, $3)); } |
028299c6 | 2398 | | ';' |
64094f6a | 2399 | { $$ = NULL_TREE; } |
264fa2db ZL |
2400 | @@ifobjc |
2401 | | AT_THROW expr ';' | |
e13e48e7 EC |
2402 | { stmt_count++; |
2403 | $$ = objc_build_throw_stmt ($2); | |
264fa2db ZL |
2404 | } |
2405 | | AT_THROW ';' | |
e13e48e7 EC |
2406 | { stmt_count++; |
2407 | $$ = objc_build_throw_stmt (NULL_TREE); | |
264fa2db | 2408 | } |
e13e48e7 | 2409 | | objc_try_catch_stmt |
264fa2db ZL |
2410 | { objc_build_finally_prologue (); } |
2411 | objc_finally_block | |
2412 | { $$ = objc_build_try_catch_finally_stmt ($1, $3); } | |
e13e48e7 | 2413 | | AT_SYNCHRONIZED '(' expr ')' |
264fa2db ZL |
2414 | { objc_build_synchronized_prologue ($3); } |
2415 | compstmt | |
2416 | { $$ = objc_build_synchronized_epilogue (); } | |
2417 | ; | |
2418 | ||
2419 | objc_try_catch_stmt: | |
2420 | objc_try_stmt | |
2421 | { objc_build_try_epilogue (1); } | |
2422 | objc_catch_list | |
2423 | { objc_build_catch_epilogue (); $$ = 1; } | |
2424 | | objc_try_stmt | |
2425 | { objc_build_try_epilogue (0); $$ = 0; } | |
2426 | ; | |
2427 | ||
2428 | ||
2429 | objc_try_stmt: | |
e13e48e7 | 2430 | AT_TRY |
264fa2db | 2431 | { objc_build_try_prologue (); } |
e13e48e7 | 2432 | compstmt |
264fa2db | 2433 | ; |
e13e48e7 | 2434 | |
264fa2db ZL |
2435 | objc_catch_list: |
2436 | objc_catch_list objc_catch_block | |
2437 | | objc_catch_block | |
2438 | ; | |
2439 | ||
2440 | objc_catch_block: | |
e13e48e7 | 2441 | AT_CATCH '(' parm ')' |
264fa2db ZL |
2442 | { objc_build_catch_stmt ($3); } |
2443 | compstmt | |
2444 | { stmt_count++; } | |
2445 | ; | |
2446 | ||
2447 | objc_finally_block: | |
2448 | AT_FINALLY compstmt | |
2449 | { $$ = 1; } | |
2450 | | /* NULL */ | |
2451 | { $$ = 0; } | |
2452 | @@end_ifobjc | |
028299c6 RS |
2453 | ; |
2454 | ||
2455 | /* Any kind of label, including jump labels and case labels. | |
2456 | ANSI C accepts labels only before statements, but we allow them | |
2457 | also at the end of a compound statement. */ | |
2458 | ||
b00e5f0d | 2459 | label: CASE expr_no_commas ':' |
56cb9733 | 2460 | { stmt_count++; |
64094f6a | 2461 | $$ = do_case ($2, NULL_TREE); } |
b00e5f0d | 2462 | | CASE expr_no_commas ELLIPSIS expr_no_commas ':' |
56cb9733 | 2463 | { stmt_count++; |
64094f6a | 2464 | $$ = do_case ($2, $4); } |
028299c6 | 2465 | | DEFAULT ':' |
56cb9733 | 2466 | { stmt_count++; |
64094f6a | 2467 | $$ = do_case (NULL_TREE, NULL_TREE); } |
374a4e6c | 2468 | | identifier save_location ':' maybe_attribute |
5b030314 | 2469 | { tree label = define_label ($2, $1); |
028299c6 | 2470 | stmt_count++; |
028299c6 | 2471 | if (label) |
736b02fd | 2472 | { |
374a4e6c | 2473 | decl_attributes (&label, $4, 0); |
64094f6a | 2474 | $$ = add_stmt (build_stmt (LABEL_STMT, label)); |
736b02fd | 2475 | } |
64094f6a RH |
2476 | else |
2477 | $$ = NULL_TREE; | |
0e5921e8 | 2478 | } |
028299c6 RS |
2479 | ; |
2480 | ||
9f0e2d86 | 2481 | /* Asm expressions and statements */ |
028299c6 | 2482 | |
9f0e2d86 ZW |
2483 | /* simple_asm_expr is used in restricted contexts, where a full |
2484 | expression with inputs and outputs does not make sense. */ | |
2485 | simple_asm_expr: | |
21526606 EC |
2486 | ASM_KEYWORD stop_string_translation |
2487 | '(' STRING ')' start_string_translation | |
2488 | { $$ = $4; } | |
9f0e2d86 ZW |
2489 | ; |
2490 | ||
2491 | /* maybeasm: used for assembly names for declarations */ | |
2492 | maybeasm: | |
2493 | /* empty */ | |
0de456a5 | 2494 | { $$ = NULL_TREE; } |
9f0e2d86 | 2495 | | simple_asm_expr |
028299c6 RS |
2496 | ; |
2497 | ||
9f0e2d86 ZW |
2498 | /* asmdef: asm() outside a function body. */ |
2499 | asmdef: | |
2500 | simple_asm_expr ';' | |
2501 | { assemble_asm ($1); } | |
21526606 EC |
2502 | | ASM_KEYWORD error start_string_translation ';' |
2503 | {} | |
9f0e2d86 ZW |
2504 | ; |
2505 | ||
2506 | /* Full-blown asm statement with inputs, outputs, clobbers, and | |
2507 | volatile tag allowed. */ | |
2508 | asm_stmt: | |
21526606 EC |
2509 | ASM_KEYWORD maybe_volatile stop_string_translation |
2510 | '(' asm_argument ')' start_string_translation ';' | |
9f0e2d86 | 2511 | { stmt_count++; |
21526606 | 2512 | $$ = build_asm_stmt ($2, $5); } |
9f0e2d86 ZW |
2513 | ; |
2514 | ||
2515 | asm_argument: | |
2516 | /* no operands */ | |
2517 | STRING | |
2518 | { $$ = build_asm_expr ($1, 0, 0, 0, true); } | |
2519 | /* output operands */ | |
2520 | | STRING ':' asm_operands | |
2521 | { $$ = build_asm_expr ($1, $3, 0, 0, false); } | |
2522 | /* output and input operands */ | |
2523 | | STRING ':' asm_operands ':' asm_operands | |
2524 | { $$ = build_asm_expr ($1, $3, $5, 0, false); } | |
2525 | /* output and input operands and clobbers */ | |
2526 | | STRING ':' asm_operands ':' asm_operands ':' asm_clobbers | |
2527 | { $$ = build_asm_expr ($1, $3, $5, $7, false); } | |
2528 | ; | |
2529 | ||
2530 | /* Either 'volatile' or nothing. First thing in an `asm' statement. */ | |
2531 | ||
2532 | maybe_volatile: | |
028299c6 | 2533 | /* empty */ |
9f0e2d86 ZW |
2534 | { $$ = 0; } |
2535 | | TYPE_QUAL | |
2536 | { if ($1 != ridpointers[RID_VOLATILE]) | |
2537 | { | |
2538 | warning ("%E qualifier ignored on asm", $1); | |
2539 | $$ = 0; | |
2540 | } | |
2541 | else | |
2542 | $$ = $1; | |
2543 | } | |
028299c6 RS |
2544 | ; |
2545 | ||
2546 | /* These are the operands other than the first string and colon | |
2547 | in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ | |
2548 | asm_operands: /* empty */ | |
2549 | { $$ = NULL_TREE; } | |
2550 | | nonnull_asm_operands | |
2551 | ; | |
2552 | ||
2553 | nonnull_asm_operands: | |
2554 | asm_operand | |
2555 | | nonnull_asm_operands ',' asm_operand | |
2556 | { $$ = chainon ($1, $3); } | |
2557 | ; | |
2558 | ||
2559 | asm_operand: | |
21526606 EC |
2560 | STRING start_string_translation '(' expr ')' stop_string_translation |
2561 | { $$ = build_tree_list (build_tree_list (NULL_TREE, $1), $4); } | |
2562 | | '[' identifier ']' STRING start_string_translation | |
2563 | '(' expr ')' stop_string_translation | |
fc552851 RS |
2564 | { $2 = build_string (IDENTIFIER_LENGTH ($2), |
2565 | IDENTIFIER_POINTER ($2)); | |
21526606 | 2566 | $$ = build_tree_list (build_tree_list ($2, $4), $7); } |
028299c6 RS |
2567 | ; |
2568 | ||
2569 | asm_clobbers: | |
b84a3874 RH |
2570 | STRING |
2571 | { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } | |
2572 | | asm_clobbers ',' STRING | |
2573 | { $$ = tree_cons (NULL_TREE, $3, $1); } | |
028299c6 | 2574 | ; |
21526606 EC |
2575 | |
2576 | stop_string_translation: | |
2577 | { c_lex_string_translate = false; } | |
2578 | ; | |
2579 | ||
2580 | start_string_translation: | |
2581 | { c_lex_string_translate = true; } | |
2582 | ; | |
2583 | ||
028299c6 RS |
2584 | \f |
2585 | /* This is what appears inside the parens in a function declarator. | |
25d78ace JM |
2586 | Its value is a list of ..._TYPE nodes. Attributes must appear here |
2587 | to avoid a conflict with their appearance after an open parenthesis | |
2588 | in an abstract declarator, as in | |
2589 | "void bar (int (__attribute__((__mode__(SI))) int foo));". */ | |
028299c6 | 2590 | parmlist: |
25d78ace | 2591 | maybe_attribute |
028299c6 | 2592 | { pushlevel (0); |
eb1dfbb2 | 2593 | declare_parm_level (); } |
028299c6 | 2594 | parmlist_1 |
25d78ace | 2595 | { $$ = $3; |
028299c6 RS |
2596 | poplevel (0, 0, 0); } |
2597 | ; | |
2598 | ||
2599 | parmlist_1: | |
2600 | parmlist_2 ')' | |
2601 | | parms ';' | |
55d54003 | 2602 | { mark_forward_parm_decls (); } |
25d78ace JM |
2603 | maybe_attribute |
2604 | { /* Dummy action so attributes are in known place | |
2605 | on parser stack. */ } | |
028299c6 | 2606 | parmlist_1 |
25d78ace | 2607 | { $$ = $6; } |
028299c6 RS |
2608 | | error ')' |
2609 | { $$ = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); } | |
2610 | ; | |
2611 | ||
2612 | /* This is what appears inside the parens in a function declarator. | |
2613 | Is value is represented in the format that grokdeclarator expects. */ | |
2614 | parmlist_2: /* empty */ | |
2615 | { $$ = get_parm_info (0); } | |
2616 | | ELLIPSIS | |
2617 | { $$ = get_parm_info (0); | |
aff2a12b RK |
2618 | /* Gcc used to allow this as an extension. However, it does |
2619 | not work for all targets, and thus has been disabled. | |
2620 | Also, since func (...) and func () are indistinguishable, | |
2621 | it caused problems with the code in expand_builtin which | |
2622 | tries to verify that BUILT_IN_NEXT_ARG is being used | |
2623 | correctly. */ | |
89abf8d1 | 2624 | error ("ISO C requires a named argument before `...'"); |
2409cb37 | 2625 | parsing_iso_function_signature = true; |
028299c6 RS |
2626 | } |
2627 | | parms | |
622d3731 KG |
2628 | { $$ = get_parm_info (1); |
2629 | parsing_iso_function_signature = true; | |
2630 | } | |
028299c6 | 2631 | | parms ',' ELLIPSIS |
2409cb37 KC |
2632 | { $$ = get_parm_info (0); |
2633 | parsing_iso_function_signature = true; | |
2634 | } | |
028299c6 RS |
2635 | ; |
2636 | ||
2637 | parms: | |
25d78ace | 2638 | firstparm |
028299c6 RS |
2639 | { push_parm_decl ($1); } |
2640 | | parms ',' parm | |
2641 | { push_parm_decl ($3); } | |
2642 | ; | |
2643 | ||
2644 | /* A single parameter declaration or parameter type name, | |
2645 | as found in a parmlist. */ | |
2646 | parm: | |
25d78ace | 2647 | declspecs_ts setspecs parm_declarator maybe_attribute |
d27543a7 RK |
2648 | { $$ = build_tree_list (build_tree_list (current_declspecs, |
2649 | $3), | |
4b01f8d8 JM |
2650 | chainon ($4, all_prefix_attributes)); |
2651 | POP_DECLSPEC_STACK; } | |
25d78ace | 2652 | | declspecs_ts setspecs notype_declarator maybe_attribute |
d27543a7 RK |
2653 | { $$ = build_tree_list (build_tree_list (current_declspecs, |
2654 | $3), | |
84d901be | 2655 | chainon ($4, all_prefix_attributes)); |
4b01f8d8 | 2656 | POP_DECLSPEC_STACK; } |
25d78ace JM |
2657 | | declspecs_ts setspecs absdcl_maybe_attribute |
2658 | { $$ = $3; | |
4b01f8d8 | 2659 | POP_DECLSPEC_STACK; } |
25d78ace | 2660 | | declspecs_nots setspecs notype_declarator maybe_attribute |
d27543a7 RK |
2661 | { $$ = build_tree_list (build_tree_list (current_declspecs, |
2662 | $3), | |
4b01f8d8 JM |
2663 | chainon ($4, all_prefix_attributes)); |
2664 | POP_DECLSPEC_STACK; } | |
25d78ace JM |
2665 | |
2666 | | declspecs_nots setspecs absdcl_maybe_attribute | |
2667 | { $$ = $3; | |
4b01f8d8 | 2668 | POP_DECLSPEC_STACK; } |
25d78ace JM |
2669 | ; |
2670 | ||
2671 | /* The first parm, which must suck attributes from off the top of the parser | |
2672 | stack. */ | |
2673 | firstparm: | |
2674 | declspecs_ts_nosa setspecs_fp parm_declarator maybe_attribute | |
d27543a7 RK |
2675 | { $$ = build_tree_list (build_tree_list (current_declspecs, |
2676 | $3), | |
4b01f8d8 JM |
2677 | chainon ($4, all_prefix_attributes)); |
2678 | POP_DECLSPEC_STACK; } | |
25d78ace JM |
2679 | | declspecs_ts_nosa setspecs_fp notype_declarator maybe_attribute |
2680 | { $$ = build_tree_list (build_tree_list (current_declspecs, | |
2681 | $3), | |
84d901be | 2682 | chainon ($4, all_prefix_attributes)); |
4b01f8d8 | 2683 | POP_DECLSPEC_STACK; } |
25d78ace JM |
2684 | | declspecs_ts_nosa setspecs_fp absdcl_maybe_attribute |
2685 | { $$ = $3; | |
4b01f8d8 | 2686 | POP_DECLSPEC_STACK; } |
25d78ace | 2687 | | declspecs_nots_nosa setspecs_fp notype_declarator maybe_attribute |
d27543a7 RK |
2688 | { $$ = build_tree_list (build_tree_list (current_declspecs, |
2689 | $3), | |
4b01f8d8 JM |
2690 | chainon ($4, all_prefix_attributes)); |
2691 | POP_DECLSPEC_STACK; } | |
25d78ace JM |
2692 | |
2693 | | declspecs_nots_nosa setspecs_fp absdcl_maybe_attribute | |
2694 | { $$ = $3; | |
4b01f8d8 | 2695 | POP_DECLSPEC_STACK; } |
25d78ace JM |
2696 | ; |
2697 | ||
2698 | setspecs_fp: | |
2699 | setspecs | |
4b01f8d8 JM |
2700 | { prefix_attributes = chainon (prefix_attributes, $<ttype>-2); |
2701 | all_prefix_attributes = prefix_attributes; } | |
028299c6 RS |
2702 | ; |
2703 | ||
2704 | /* This is used in a function definition | |
2705 | where either a parmlist or an identifier list is ok. | |
2706 | Its value is a list of ..._TYPE nodes or a list of identifiers. */ | |
2707 | parmlist_or_identifiers: | |
709619d9 | 2708 | maybe_attribute |
028299c6 | 2709 | { pushlevel (0); |
eb1dfbb2 | 2710 | declare_parm_level (); } |
028299c6 | 2711 | parmlist_or_identifiers_1 |
709619d9 | 2712 | { $$ = $3; |
d27543a7 | 2713 | poplevel (0, 0, 0); } |
028299c6 RS |
2714 | ; |
2715 | ||
2716 | parmlist_or_identifiers_1: | |
2717 | parmlist_1 | |
2718 | | identifiers ')' | |
2719 | { tree t; | |
2720 | for (t = $1; t; t = TREE_CHAIN (t)) | |
2721 | if (TREE_VALUE (t) == NULL_TREE) | |
2722 | error ("`...' in old-style identifier list"); | |
709619d9 AH |
2723 | $$ = tree_cons (NULL_TREE, NULL_TREE, $1); |
2724 | ||
2725 | /* Make sure we have a parmlist after attributes. */ | |
2726 | if ($<ttype>-1 != 0 | |
2727 | && (TREE_CODE ($$) != TREE_LIST | |
2728 | || TREE_PURPOSE ($$) == 0 | |
2729 | || TREE_CODE (TREE_PURPOSE ($$)) != PARM_DECL)) | |
2730 | YYERROR1; | |
2731 | } | |
028299c6 RS |
2732 | ; |
2733 | ||
2734 | /* A nonempty list of identifiers. */ | |
2735 | identifiers: | |
2736 | IDENTIFIER | |
2737 | { $$ = build_tree_list (NULL_TREE, $1); } | |
2738 | | identifiers ',' IDENTIFIER | |
2739 | { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } | |
2740 | ; | |
2741 | ||
2742 | /* A nonempty list of identifiers, including typenames. */ | |
2743 | identifiers_or_typenames: | |
2744 | identifier | |
2745 | { $$ = build_tree_list (NULL_TREE, $1); } | |
2746 | | identifiers_or_typenames ',' identifier | |
2747 | { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } | |
2748 | ; | |
72acf258 JM |
2749 | |
2750 | extension: | |
2751 | EXTENSION | |
750491fc | 2752 | { $$ = SAVE_EXT_FLAGS(); |
c3b6e114 | 2753 | pedantic = 0; |
5137bd4f | 2754 | warn_pointer_arith = 0; |
750491fc RH |
2755 | warn_traditional = 0; |
2756 | flag_iso = 0; } | |
72acf258 | 2757 | ; |
028299c6 | 2758 | \f |
264fa2db | 2759 | @@ifobjc |
028299c6 RS |
2760 | /* Objective-C productions. */ |
2761 | ||
2762 | objcdef: | |
2763 | classdef | |
e31c7eec TW |
2764 | | classdecl |
2765 | | aliasdecl | |
2766 | | protocoldef | |
028299c6 RS |
2767 | | methoddef |
2768 | | END | |
2769 | { | |
2770 | if (objc_implementation_context) | |
2771 | { | |
2772 | finish_class (objc_implementation_context); | |
2773 | objc_ivar_chain = NULL_TREE; | |
2774 | objc_implementation_context = NULL_TREE; | |
2775 | } | |
2776 | else | |
2777 | warning ("`@end' must appear in an implementation context"); | |
2778 | } | |
2779 | ; | |
2780 | ||
e31c7eec TW |
2781 | /* A nonempty list of identifiers. */ |
2782 | identifier_list: | |
2783 | identifier | |
2784 | { $$ = build_tree_list (NULL_TREE, $1); } | |
2785 | | identifier_list ',' identifier | |
2786 | { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } | |
2787 | ; | |
2788 | ||
2789 | classdecl: | |
2790 | CLASS identifier_list ';' | |
2791 | { | |
2792 | objc_declare_class ($2); | |
2793 | } | |
84d901be | 2794 | ; |
e31c7eec TW |
2795 | |
2796 | aliasdecl: | |
2797 | ALIAS identifier identifier ';' | |
2798 | { | |
2799 | objc_declare_alias ($2, $3); | |
2800 | } | |
84d901be | 2801 | ; |
e31c7eec | 2802 | |
264fa2db ZL |
2803 | superclass: |
2804 | ':' identifier { $$ = $2; } | |
2805 | | /* NULL */ %prec HYPERUNARY { $$ = NULL_TREE; } | |
2806 | ; | |
028299c6 | 2807 | |
264fa2db ZL |
2808 | class_ivars: |
2809 | '{' ivar_decl_list '}' | |
2810 | | /* NULL */ | |
2811 | ; | |
028299c6 | 2812 | |
264fa2db ZL |
2813 | classdef: |
2814 | INTERFACE identifier superclass protocolrefs | |
028299c6 RS |
2815 | { |
2816 | objc_interface_context = objc_ivar_context | |
264fa2db | 2817 | = start_class (CLASS_INTERFACE_TYPE, $2, $3, $4); |
028299c6 RS |
2818 | objc_public_flag = 0; |
2819 | } | |
264fa2db | 2820 | class_ivars |
028299c6 RS |
2821 | { |
2822 | continue_class (objc_interface_context); | |
2823 | } | |
264fa2db | 2824 | methodprotolist END |
028299c6 RS |
2825 | { |
2826 | finish_class (objc_interface_context); | |
2827 | objc_interface_context = NULL_TREE; | |
2828 | } | |
2829 | ||
264fa2db | 2830 | | IMPLEMENTATION identifier superclass |
028299c6 RS |
2831 | { |
2832 | objc_implementation_context = objc_ivar_context | |
264fa2db | 2833 | = start_class (CLASS_IMPLEMENTATION_TYPE, $2, $3, NULL_TREE); |
028299c6 RS |
2834 | objc_public_flag = 0; |
2835 | } | |
264fa2db | 2836 | class_ivars |
028299c6 RS |
2837 | { |
2838 | objc_ivar_chain | |
2839 | = continue_class (objc_implementation_context); | |
2840 | } | |
2841 | ||
e31c7eec | 2842 | | INTERFACE identifier '(' identifier ')' protocolrefs |
028299c6 RS |
2843 | { |
2844 | objc_interface_context | |
e31c7eec | 2845 | = start_class (CATEGORY_INTERFACE_TYPE, $2, $4, $6); |
028299c6 RS |
2846 | continue_class (objc_interface_context); |
2847 | } | |
264fa2db | 2848 | methodprotolist END |
028299c6 RS |
2849 | { |
2850 | finish_class (objc_interface_context); | |
2851 | objc_interface_context = NULL_TREE; | |
2852 | } | |
2853 | ||
2854 | | IMPLEMENTATION identifier '(' identifier ')' | |
2855 | { | |
2856 | objc_implementation_context | |
e31c7eec | 2857 | = start_class (CATEGORY_IMPLEMENTATION_TYPE, $2, $4, NULL_TREE); |
028299c6 RS |
2858 | objc_ivar_chain |
2859 | = continue_class (objc_implementation_context); | |
2860 | } | |
2861 | ; | |
2862 | ||
e31c7eec TW |
2863 | protocoldef: |
2864 | PROTOCOL identifier protocolrefs | |
2865 | { | |
4c521bad | 2866 | objc_pq_context = 1; |
e31c7eec TW |
2867 | objc_interface_context |
2868 | = start_protocol(PROTOCOL_INTERFACE_TYPE, $2, $3); | |
2869 | } | |
2870 | methodprotolist END | |
2871 | { | |
4c521bad | 2872 | objc_pq_context = 0; |
e31c7eec TW |
2873 | finish_protocol(objc_interface_context); |
2874 | objc_interface_context = NULL_TREE; | |
2875 | } | |
f2e6e530 ZL |
2876 | /* The @protocol forward-declaration production introduces a |
2877 | reduce/reduce conflict on ';', which should be resolved in | |
2878 | favor of the production 'identifier_list -> identifier'. */ | |
2879 | | PROTOCOL identifier_list ';' | |
2880 | { | |
2881 | objc_declare_protocols ($2); | |
2882 | } | |
e31c7eec TW |
2883 | ; |
2884 | ||
2885 | protocolrefs: | |
2886 | /* empty */ | |
2887 | { | |
2888 | $$ = NULL_TREE; | |
2889 | } | |
957a1c32 RK |
2890 | | non_empty_protocolrefs |
2891 | ; | |
2892 | ||
2893 | non_empty_protocolrefs: | |
2894 | ARITHCOMPARE identifier_list ARITHCOMPARE | |
e31c7eec TW |
2895 | { |
2896 | if ($1 == LT_EXPR && $3 == GT_EXPR) | |
2897 | $$ = $2; | |
2898 | else | |
2899 | YYERROR1; | |
2900 | } | |
2901 | ; | |
2902 | ||
028299c6 | 2903 | ivar_decl_list: |
e31c7eec | 2904 | ivar_decl_list visibility_spec ivar_decls |
028299c6 RS |
2905 | | ivar_decls |
2906 | ; | |
2907 | ||
e31c7eec TW |
2908 | visibility_spec: |
2909 | PRIVATE { objc_public_flag = 2; } | |
2910 | | PROTECTED { objc_public_flag = 0; } | |
2911 | | PUBLIC { objc_public_flag = 1; } | |
2912 | ; | |
2913 | ||
028299c6 RS |
2914 | ivar_decls: |
2915 | /* empty */ | |
2916 | { | |
2917 | $$ = NULL_TREE; | |
2918 | } | |
2919 | | ivar_decls ivar_decl ';' | |
2920 | | ivar_decls ';' | |
2921 | { | |
2922 | if (pedantic) | |
ea3cfc81 | 2923 | pedwarn ("extra semicolon in struct or union specified"); |
028299c6 RS |
2924 | } |
2925 | ; | |
2926 | ||
2927 | ||
2928 | /* There is a shift-reduce conflict here, because `components' may | |
2929 | start with a `typename'. It happens that shifting (the default resolution) | |
2930 | does the right thing, because it treats the `typename' as part of | |
2931 | a `typed_typespecs'. | |
2932 | ||
2933 | It is possible that this same technique would allow the distinction | |
2934 | between `notype_initdecls' and `initdecls' to be eliminated. | |
2935 | But I am being cautious and not trying it. */ | |
2936 | ||
2937 | ivar_decl: | |
25d78ace | 2938 | declspecs_nosc_ts setspecs ivars |
962a2496 | 2939 | { $$ = $3; |
4b01f8d8 | 2940 | POP_DECLSPEC_STACK; } |
25d78ace | 2941 | | declspecs_nosc_nots setspecs ivars |
962a2496 | 2942 | { $$ = $3; |
4b01f8d8 | 2943 | POP_DECLSPEC_STACK; } |
028299c6 RS |
2944 | | error |
2945 | { $$ = NULL_TREE; } | |
2946 | ; | |
2947 | ||
2948 | ivars: | |
2949 | /* empty */ | |
2950 | { $$ = NULL_TREE; } | |
2951 | | ivar_declarator | |
4b01f8d8 | 2952 | | ivars ',' maybe_resetattrs ivar_declarator |
028299c6 RS |
2953 | ; |
2954 | ||
2955 | ivar_declarator: | |
2956 | declarator | |
2957 | { | |
2958 | $$ = add_instance_variable (objc_ivar_context, | |
2959 | objc_public_flag, | |
2960 | $1, current_declspecs, | |
2961 | NULL_TREE); | |
2962 | } | |
2963 | | declarator ':' expr_no_commas | |
2964 | { | |
2965 | $$ = add_instance_variable (objc_ivar_context, | |
2966 | objc_public_flag, | |
2967 | $1, current_declspecs, $3); | |
2968 | } | |
2969 | | ':' expr_no_commas | |
2970 | { | |
2971 | $$ = add_instance_variable (objc_ivar_context, | |
2972 | objc_public_flag, | |
2973 | NULL_TREE, | |
2974 | current_declspecs, $2); | |
2975 | } | |
2976 | ; | |
2977 | ||
0b1cdaf2 | 2978 | methodtype: |
028299c6 | 2979 | '+' |
0b1cdaf2 | 2980 | { objc_inherit_code = CLASS_METHOD_DECL; } |
028299c6 | 2981 | | '-' |
0b1cdaf2 NB |
2982 | { objc_inherit_code = INSTANCE_METHOD_DECL; } |
2983 | ; | |
2984 | ||
2985 | methoddef: | |
2986 | methodtype | |
028299c6 | 2987 | { |
4c521bad | 2988 | objc_pq_context = 1; |
0b1cdaf2 | 2989 | if (!objc_implementation_context) |
400500c4 | 2990 | fatal_error ("method definition not in class context"); |
028299c6 RS |
2991 | } |
2992 | methoddecl | |
2993 | { | |
4c521bad | 2994 | objc_pq_context = 0; |
4898423c ZL |
2995 | objc_add_method (objc_implementation_context, |
2996 | $3, | |
2997 | objc_inherit_code == CLASS_METHOD_DECL); | |
028299c6 | 2998 | start_method_def ($3); |
028299c6 RS |
2999 | } |
3000 | optarglist | |
3001 | { | |
3002 | continue_method_def (); | |
3003 | } | |
3004 | compstmt_or_error | |
3005 | { | |
3006 | finish_method_def (); | |
028299c6 RS |
3007 | } |
3008 | ; | |
3009 | ||
3010 | /* the reason for the strange actions in this rule | |
3011 | is so that notype_initdecls when reached via datadef | |
3012 | can find a valid list of type and sc specs in $0. */ | |
3013 | ||
3014 | methodprotolist: | |
3015 | /* empty */ | |
264fa2db ZL |
3016 | | methodprotolist methodproto |
3017 | | methodprotolist { $<ttype>$ = NULL_TREE; } datadef | |
028299c6 RS |
3018 | ; |
3019 | ||
3020 | semi_or_error: | |
3021 | ';' | |
3022 | | error | |
3023 | ; | |
3024 | ||
3025 | methodproto: | |
0b1cdaf2 | 3026 | methodtype |
028299c6 | 3027 | { |
990ac8d7 | 3028 | /* Remember protocol qualifiers in prototypes. */ |
4c521bad | 3029 | objc_pq_context = 1; |
028299c6 RS |
3030 | } |
3031 | methoddecl | |
3032 | { | |
990ac8d7 | 3033 | /* Forget protocol qualifiers here. */ |
4c521bad | 3034 | objc_pq_context = 0; |
4898423c ZL |
3035 | objc_add_method (objc_interface_context, |
3036 | $3, | |
3037 | objc_inherit_code == CLASS_METHOD_DECL); | |
028299c6 RS |
3038 | } |
3039 | semi_or_error | |
3040 | ; | |
3041 | ||
3042 | methoddecl: | |
3043 | '(' typename ')' unaryselector | |
3044 | { | |
3045 | $$ = build_method_decl (objc_inherit_code, $2, $4, NULL_TREE); | |
3046 | } | |
3047 | ||
3048 | | unaryselector | |
3049 | { | |
3050 | $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, NULL_TREE); | |
3051 | } | |
3052 | ||
3053 | | '(' typename ')' keywordselector optparmlist | |
3054 | { | |
3055 | $$ = build_method_decl (objc_inherit_code, $2, $4, $5); | |
3056 | } | |
3057 | ||
3058 | | keywordselector optparmlist | |
3059 | { | |
3060 | $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, $2); | |
3061 | } | |
3062 | ; | |
3063 | ||
3064 | /* "optarglist" assumes that start_method_def has already been called... | |
3065 | if it is not, the "xdecls" will not be placed in the proper scope */ | |
3066 | ||
3067 | optarglist: | |
3068 | /* empty */ | |
3069 | | ';' myxdecls | |
3070 | ; | |
3071 | ||
3072 | /* to get around the following situation: "int foo (int a) int b; {}" that | |
3073 | is synthesized when parsing "- a:a b:b; id c; id d; { ... }" */ | |
3074 | ||
3075 | myxdecls: | |
3076 | /* empty */ | |
3077 | | mydecls | |
3078 | ; | |
3079 | ||
3080 | mydecls: | |
3081 | mydecl | |
3082 | | errstmt | |
3083 | | mydecls mydecl | |
3084 | | mydecl errstmt | |
3085 | ; | |
3086 | ||
3087 | mydecl: | |
25d78ace | 3088 | declspecs_ts setspecs myparms ';' |
4b01f8d8 | 3089 | { POP_DECLSPEC_STACK; } |
25d78ace | 3090 | | declspecs_ts ';' |
028299c6 | 3091 | { shadow_tag ($1); } |
25d78ace | 3092 | | declspecs_nots ';' |
028299c6 RS |
3093 | { pedwarn ("empty declaration"); } |
3094 | ; | |
3095 | ||
3096 | myparms: | |
3097 | myparm | |
3098 | { push_parm_decl ($1); } | |
3099 | | myparms ',' myparm | |
3100 | { push_parm_decl ($3); } | |
3101 | ; | |
3102 | ||
3103 | /* A single parameter declaration or parameter type name, | |
3104 | as found in a parmlist. DOES NOT ALLOW AN INITIALIZER OR ASMSPEC */ | |
3105 | ||
3106 | myparm: | |
f6999fed RK |
3107 | parm_declarator maybe_attribute |
3108 | { $$ = build_tree_list (build_tree_list (current_declspecs, | |
3109 | $1), | |
4b01f8d8 | 3110 | chainon ($2, all_prefix_attributes)); } |
f6999fed RK |
3111 | | notype_declarator maybe_attribute |
3112 | { $$ = build_tree_list (build_tree_list (current_declspecs, | |
3113 | $1), | |
4b01f8d8 | 3114 | chainon ($2, all_prefix_attributes)); } |
25d78ace JM |
3115 | | absdcl_maybe_attribute |
3116 | { $$ = $1; } | |
028299c6 RS |
3117 | ; |
3118 | ||
3119 | optparmlist: | |
3120 | /* empty */ | |
3121 | { | |
c14bc6db | 3122 | $$ = NULL_TREE; |
028299c6 RS |
3123 | } |
3124 | | ',' ELLIPSIS | |
3125 | { | |
3126 | /* oh what a kludge! */ | |
bcdb1106 | 3127 | $$ = objc_ellipsis_node; |
028299c6 RS |
3128 | } |
3129 | | ',' | |
3130 | { | |
3131 | pushlevel (0); | |
3132 | } | |
3133 | parmlist_2 | |
3134 | { | |
c14bc6db | 3135 | /* returns a tree list node generated by get_parm_info */ |
028299c6 RS |
3136 | $$ = $3; |
3137 | poplevel (0, 0, 0); | |
3138 | } | |
3139 | ; | |
3140 | ||
3141 | unaryselector: | |
3142 | selector | |
3143 | ; | |
3144 | ||
3145 | keywordselector: | |
3146 | keyworddecl | |
3147 | ||
3148 | | keywordselector keyworddecl | |
3149 | { | |
3150 | $$ = chainon ($1, $2); | |
3151 | } | |
3152 | ; | |
3153 | ||
3154 | selector: | |
3155 | IDENTIFIER | |
f2e6e530 ZL |
3156 | | TYPENAME |
3157 | | CLASSNAME | |
3158 | | OBJECTNAME | |
028299c6 RS |
3159 | | reservedwords |
3160 | ; | |
3161 | ||
3162 | reservedwords: | |
0e5921e8 ZW |
3163 | ENUM | STRUCT | UNION | IF | ELSE | WHILE | DO | FOR |
3164 | | SWITCH | CASE | DEFAULT | BREAK | CONTINUE | RETURN | |
3165 | | GOTO | ASM_KEYWORD | SIZEOF | TYPEOF | ALIGNOF | |
028299c6 RS |
3166 | | TYPESPEC | TYPE_QUAL |
3167 | ; | |
3168 | ||
3169 | keyworddecl: | |
3170 | selector ':' '(' typename ')' identifier | |
3171 | { | |
3172 | $$ = build_keyword_decl ($1, $4, $6); | |
3173 | } | |
3174 | ||
3175 | | selector ':' identifier | |
3176 | { | |
3177 | $$ = build_keyword_decl ($1, NULL_TREE, $3); | |
3178 | } | |
3179 | ||
3180 | | ':' '(' typename ')' identifier | |
3181 | { | |
3182 | $$ = build_keyword_decl (NULL_TREE, $3, $5); | |
3183 | } | |
3184 | ||
3185 | | ':' identifier | |
3186 | { | |
3187 | $$ = build_keyword_decl (NULL_TREE, NULL_TREE, $2); | |
3188 | } | |
3189 | ; | |
3190 | ||
3191 | messageargs: | |
3192 | selector | |
3193 | | keywordarglist | |
3194 | ; | |
3195 | ||
3196 | keywordarglist: | |
3197 | keywordarg | |
3198 | | keywordarglist keywordarg | |
3199 | { | |
3200 | $$ = chainon ($1, $2); | |
3201 | } | |
3202 | ; | |
3203 | ||
3204 | ||
3205 | keywordexpr: | |
3206 | nonnull_exprlist | |
3207 | { | |
3208 | if (TREE_CHAIN ($1) == NULL_TREE) | |
3209 | /* just return the expr., remove a level of indirection */ | |
3210 | $$ = TREE_VALUE ($1); | |
3211 | else | |
3212 | /* we have a comma expr., we will collapse later */ | |
3213 | $$ = $1; | |
3214 | } | |
3215 | ; | |
3216 | ||
3217 | keywordarg: | |
3218 | selector ':' keywordexpr | |
3219 | { | |
3220 | $$ = build_tree_list ($1, $3); | |
3221 | } | |
3222 | | ':' keywordexpr | |
3223 | { | |
3224 | $$ = build_tree_list (NULL_TREE, $2); | |
3225 | } | |
3226 | ; | |
3227 | ||
3228 | receiver: | |
3229 | expr | |
3230 | | CLASSNAME | |
3231 | { | |
3232 | $$ = get_class_reference ($1); | |
3233 | } | |
264fa2db ZL |
3234 | | TYPENAME |
3235 | { | |
3236 | $$ = get_class_reference ($1); | |
3237 | } | |
028299c6 RS |
3238 | ; |
3239 | ||
3240 | objcmessageexpr: | |
c1c5187c ZL |
3241 | '[' receiver messageargs ']' |
3242 | { $$ = build_tree_list ($2, $3); } | |
028299c6 RS |
3243 | ; |
3244 | ||
3245 | selectorarg: | |
3246 | selector | |
3247 | | keywordnamelist | |
3248 | ; | |
3249 | ||
3250 | keywordnamelist: | |
3251 | keywordname | |
3252 | | keywordnamelist keywordname | |
3253 | { | |
3254 | $$ = chainon ($1, $2); | |
3255 | } | |
3256 | ; | |
3257 | ||
3258 | keywordname: | |
3259 | selector ':' | |
3260 | { | |
3261 | $$ = build_tree_list ($1, NULL_TREE); | |
3262 | } | |
3263 | | ':' | |
3264 | { | |
3265 | $$ = build_tree_list (NULL_TREE, NULL_TREE); | |
3266 | } | |
3267 | ; | |
3268 | ||
3269 | objcselectorexpr: | |
3270 | SELECTOR '(' selectorarg ')' | |
3271 | { | |
3272 | $$ = $3; | |
3273 | } | |
3274 | ; | |
3275 | ||
e31c7eec TW |
3276 | objcprotocolexpr: |
3277 | PROTOCOL '(' identifier ')' | |
3278 | { | |
3279 | $$ = $3; | |
3280 | } | |
3281 | ; | |
3282 | ||
028299c6 RS |
3283 | /* extension to support C-structures in the archiver */ |
3284 | ||
3285 | objcencodeexpr: | |
3286 | ENCODE '(' typename ')' | |
3287 | { | |
3288 | $$ = groktypename ($3); | |
3289 | } | |
3290 | ; | |
3291 | ||
264fa2db | 3292 | @@end_ifobjc |
028299c6 | 3293 | %% |
0e5921e8 ZW |
3294 | |
3295 | /* yylex() is a thin wrapper around c_lex(), all it does is translate | |
3296 | cpplib.h's token codes into yacc's token codes. */ | |
0e5921e8 ZW |
3297 | |
3298 | static enum cpp_ttype last_token; | |
0e5921e8 ZW |
3299 | |
3300 | /* The reserved keyword table. */ | |
3301 | struct resword | |
3302 | { | |
3303 | const char *word; | |
3304 | ENUM_BITFIELD(rid) rid : 16; | |
3305 | unsigned int disable : 16; | |
3306 | }; | |
3307 | ||
3308 | /* Disable mask. Keywords are disabled if (reswords[i].disable & mask) is | |
3309 | _true_. */ | |
f458d1d5 ZW |
3310 | #define D_C89 0x01 /* not in C89 */ |
3311 | #define D_EXT 0x02 /* GCC extension */ | |
3312 | #define D_EXT89 0x04 /* GCC extension incorporated in C99 */ | |
3313 | #define D_OBJC 0x08 /* Objective C only */ | |
0e5921e8 ZW |
3314 | |
3315 | static const struct resword reswords[] = | |
3316 | { | |
19552aa5 | 3317 | { "_Bool", RID_BOOL, 0 }, |
d9dbd9b1 | 3318 | { "_Complex", RID_COMPLEX, 0 }, |
0ba8a114 NS |
3319 | { "__FUNCTION__", RID_FUNCTION_NAME, 0 }, |
3320 | { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 }, | |
0e5921e8 ZW |
3321 | { "__alignof", RID_ALIGNOF, 0 }, |
3322 | { "__alignof__", RID_ALIGNOF, 0 }, | |
3323 | { "__asm", RID_ASM, 0 }, | |
3324 | { "__asm__", RID_ASM, 0 }, | |
3325 | { "__attribute", RID_ATTRIBUTE, 0 }, | |
3326 | { "__attribute__", RID_ATTRIBUTE, 0 }, | |
ecbcf7b3 AH |
3327 | { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 }, |
3328 | { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 }, | |
0e5921e8 ZW |
3329 | { "__builtin_va_arg", RID_VA_ARG, 0 }, |
3330 | { "__complex", RID_COMPLEX, 0 }, | |
3331 | { "__complex__", RID_COMPLEX, 0 }, | |
3332 | { "__const", RID_CONST, 0 }, | |
3333 | { "__const__", RID_CONST, 0 }, | |
3334 | { "__extension__", RID_EXTENSION, 0 }, | |
0ba8a114 | 3335 | { "__func__", RID_C99_FUNCTION_NAME, 0 }, |
0e5921e8 ZW |
3336 | { "__imag", RID_IMAGPART, 0 }, |
3337 | { "__imag__", RID_IMAGPART, 0 }, | |
3338 | { "__inline", RID_INLINE, 0 }, | |
3339 | { "__inline__", RID_INLINE, 0 }, | |
3340 | { "__label__", RID_LABEL, 0 }, | |
3341 | { "__ptrbase", RID_PTRBASE, 0 }, | |
3342 | { "__ptrbase__", RID_PTRBASE, 0 }, | |
3343 | { "__ptrextent", RID_PTREXTENT, 0 }, | |
3344 | { "__ptrextent__", RID_PTREXTENT, 0 }, | |
3345 | { "__ptrvalue", RID_PTRVALUE, 0 }, | |
3346 | { "__ptrvalue__", RID_PTRVALUE, 0 }, | |
3347 | { "__real", RID_REALPART, 0 }, | |
3348 | { "__real__", RID_REALPART, 0 }, | |
3349 | { "__restrict", RID_RESTRICT, 0 }, | |
3350 | { "__restrict__", RID_RESTRICT, 0 }, | |
3351 | { "__signed", RID_SIGNED, 0 }, | |
3352 | { "__signed__", RID_SIGNED, 0 }, | |
3d78f2e9 | 3353 | { "__thread", RID_THREAD, 0 }, |
0e5921e8 ZW |
3354 | { "__typeof", RID_TYPEOF, 0 }, |
3355 | { "__typeof__", RID_TYPEOF, 0 }, | |
0e5921e8 ZW |
3356 | { "__volatile", RID_VOLATILE, 0 }, |
3357 | { "__volatile__", RID_VOLATILE, 0 }, | |
3358 | { "asm", RID_ASM, D_EXT }, | |
3359 | { "auto", RID_AUTO, 0 }, | |
3360 | { "break", RID_BREAK, 0 }, | |
3361 | { "case", RID_CASE, 0 }, | |
3362 | { "char", RID_CHAR, 0 }, | |
f458d1d5 | 3363 | { "const", RID_CONST, 0 }, |
0e5921e8 ZW |
3364 | { "continue", RID_CONTINUE, 0 }, |
3365 | { "default", RID_DEFAULT, 0 }, | |
3366 | { "do", RID_DO, 0 }, | |
3367 | { "double", RID_DOUBLE, 0 }, | |
3368 | { "else", RID_ELSE, 0 }, | |
3369 | { "enum", RID_ENUM, 0 }, | |
3370 | { "extern", RID_EXTERN, 0 }, | |
3371 | { "float", RID_FLOAT, 0 }, | |
3372 | { "for", RID_FOR, 0 }, | |
3373 | { "goto", RID_GOTO, 0 }, | |
3374 | { "if", RID_IF, 0 }, | |
f458d1d5 | 3375 | { "inline", RID_INLINE, D_EXT89 }, |
0e5921e8 ZW |
3376 | { "int", RID_INT, 0 }, |
3377 | { "long", RID_LONG, 0 }, | |
3378 | { "register", RID_REGISTER, 0 }, | |
f458d1d5 | 3379 | { "restrict", RID_RESTRICT, D_C89 }, |
0e5921e8 ZW |
3380 | { "return", RID_RETURN, 0 }, |
3381 | { "short", RID_SHORT, 0 }, | |
f458d1d5 | 3382 | { "signed", RID_SIGNED, 0 }, |
0e5921e8 ZW |
3383 | { "sizeof", RID_SIZEOF, 0 }, |
3384 | { "static", RID_STATIC, 0 }, | |
3385 | { "struct", RID_STRUCT, 0 }, | |
3386 | { "switch", RID_SWITCH, 0 }, | |
3387 | { "typedef", RID_TYPEDEF, 0 }, | |
f458d1d5 | 3388 | { "typeof", RID_TYPEOF, D_EXT }, |
0e5921e8 ZW |
3389 | { "union", RID_UNION, 0 }, |
3390 | { "unsigned", RID_UNSIGNED, 0 }, | |
3391 | { "void", RID_VOID, 0 }, | |
f458d1d5 | 3392 | { "volatile", RID_VOLATILE, 0 }, |
0e5921e8 | 3393 | { "while", RID_WHILE, 0 }, |
264fa2db | 3394 | @@ifobjc |
0e5921e8 | 3395 | { "id", RID_ID, D_OBJC }, |
b8363a24 ZW |
3396 | |
3397 | /* These objc keywords are recognized only immediately after | |
3398 | an '@'. */ | |
3399 | { "class", RID_AT_CLASS, D_OBJC }, | |
3400 | { "compatibility_alias", RID_AT_ALIAS, D_OBJC }, | |
3401 | { "defs", RID_AT_DEFS, D_OBJC }, | |
3402 | { "encode", RID_AT_ENCODE, D_OBJC }, | |
3403 | { "end", RID_AT_END, D_OBJC }, | |
3404 | { "implementation", RID_AT_IMPLEMENTATION, D_OBJC }, | |
3405 | { "interface", RID_AT_INTERFACE, D_OBJC }, | |
3406 | { "private", RID_AT_PRIVATE, D_OBJC }, | |
3407 | { "protected", RID_AT_PROTECTED, D_OBJC }, | |
3408 | { "protocol", RID_AT_PROTOCOL, D_OBJC }, | |
3409 | { "public", RID_AT_PUBLIC, D_OBJC }, | |
3410 | { "selector", RID_AT_SELECTOR, D_OBJC }, | |
264fa2db ZL |
3411 | { "throw", RID_AT_THROW, D_OBJC }, |
3412 | { "try", RID_AT_TRY, D_OBJC }, | |
3413 | { "catch", RID_AT_CATCH, D_OBJC }, | |
3414 | { "finally", RID_AT_FINALLY, D_OBJC }, | |
3415 | { "synchronized", RID_AT_SYNCHRONIZED, D_OBJC }, | |
b8363a24 ZW |
3416 | /* These are recognized only in protocol-qualifier context |
3417 | (see above) */ | |
71b7be38 ZW |
3418 | { "bycopy", RID_BYCOPY, D_OBJC }, |
3419 | { "byref", RID_BYREF, D_OBJC }, | |
3420 | { "in", RID_IN, D_OBJC }, | |
3421 | { "inout", RID_INOUT, D_OBJC }, | |
3422 | { "oneway", RID_ONEWAY, D_OBJC }, | |
3423 | { "out", RID_OUT, D_OBJC }, | |
264fa2db | 3424 | @@end_ifobjc |
0e5921e8 ZW |
3425 | }; |
3426 | #define N_reswords (sizeof reswords / sizeof (struct resword)) | |
3427 | ||
3428 | /* Table mapping from RID_* constants to yacc token numbers. | |
3429 | Unfortunately we have to have entries for all the keywords in all | |
3430 | three languages. */ | |
3431 | static const short rid_to_yy[RID_MAX] = | |
3432 | { | |
f79f2651 | 3433 | /* RID_STATIC */ STATIC, |
0e5921e8 ZW |
3434 | /* RID_UNSIGNED */ TYPESPEC, |
3435 | /* RID_LONG */ TYPESPEC, | |
3436 | /* RID_CONST */ TYPE_QUAL, | |
3437 | /* RID_EXTERN */ SCSPEC, | |
3438 | /* RID_REGISTER */ SCSPEC, | |
3439 | /* RID_TYPEDEF */ SCSPEC, | |
3440 | /* RID_SHORT */ TYPESPEC, | |
3441 | /* RID_INLINE */ SCSPEC, | |
3442 | /* RID_VOLATILE */ TYPE_QUAL, | |
3443 | /* RID_SIGNED */ TYPESPEC, | |
3444 | /* RID_AUTO */ SCSPEC, | |
3445 | /* RID_RESTRICT */ TYPE_QUAL, | |
3446 | ||
3447 | /* C extensions */ | |
0e5921e8 | 3448 | /* RID_COMPLEX */ TYPESPEC, |
3d78f2e9 | 3449 | /* RID_THREAD */ SCSPEC, |
0e5921e8 ZW |
3450 | |
3451 | /* C++ */ | |
3452 | /* RID_FRIEND */ 0, | |
3453 | /* RID_VIRTUAL */ 0, | |
3454 | /* RID_EXPLICIT */ 0, | |
3455 | /* RID_EXPORT */ 0, | |
3456 | /* RID_MUTABLE */ 0, | |
3457 | ||
3458 | /* ObjC */ | |
3459 | /* RID_IN */ TYPE_QUAL, | |
3460 | /* RID_OUT */ TYPE_QUAL, | |
3461 | /* RID_INOUT */ TYPE_QUAL, | |
3462 | /* RID_BYCOPY */ TYPE_QUAL, | |
3463 | /* RID_BYREF */ TYPE_QUAL, | |
3464 | /* RID_ONEWAY */ TYPE_QUAL, | |
84d901be | 3465 | |
0e5921e8 ZW |
3466 | /* C */ |
3467 | /* RID_INT */ TYPESPEC, | |
3468 | /* RID_CHAR */ TYPESPEC, | |
3469 | /* RID_FLOAT */ TYPESPEC, | |
3470 | /* RID_DOUBLE */ TYPESPEC, | |
3471 | /* RID_VOID */ TYPESPEC, | |
3472 | /* RID_ENUM */ ENUM, | |
3473 | /* RID_STRUCT */ STRUCT, | |
3474 | /* RID_UNION */ UNION, | |
3475 | /* RID_IF */ IF, | |
3476 | /* RID_ELSE */ ELSE, | |
3477 | /* RID_WHILE */ WHILE, | |
3478 | /* RID_DO */ DO, | |
3479 | /* RID_FOR */ FOR, | |
3480 | /* RID_SWITCH */ SWITCH, | |
3481 | /* RID_CASE */ CASE, | |
3482 | /* RID_DEFAULT */ DEFAULT, | |
3483 | /* RID_BREAK */ BREAK, | |
3484 | /* RID_CONTINUE */ CONTINUE, | |
3485 | /* RID_RETURN */ RETURN, | |
3486 | /* RID_GOTO */ GOTO, | |
3487 | /* RID_SIZEOF */ SIZEOF, | |
3488 | ||
3489 | /* C extensions */ | |
3490 | /* RID_ASM */ ASM_KEYWORD, | |
3491 | /* RID_TYPEOF */ TYPEOF, | |
3492 | /* RID_ALIGNOF */ ALIGNOF, | |
3493 | /* RID_ATTRIBUTE */ ATTRIBUTE, | |
3494 | /* RID_VA_ARG */ VA_ARG, | |
3495 | /* RID_EXTENSION */ EXTENSION, | |
3496 | /* RID_IMAGPART */ IMAGPART, | |
3497 | /* RID_REALPART */ REALPART, | |
3498 | /* RID_LABEL */ LABEL, | |
3499 | /* RID_PTRBASE */ PTR_BASE, | |
3500 | /* RID_PTREXTENT */ PTR_EXTENT, | |
3501 | /* RID_PTRVALUE */ PTR_VALUE, | |
3502 | ||
ecbcf7b3 AH |
3503 | /* RID_CHOOSE_EXPR */ CHOOSE_EXPR, |
3504 | /* RID_TYPES_COMPATIBLE_P */ TYPES_COMPATIBLE_P, | |
3505 | ||
e6cc3a24 ZW |
3506 | /* RID_FUNCTION_NAME */ FUNC_NAME, |
3507 | /* RID_PRETTY_FUNCTION_NAME */ FUNC_NAME, | |
3508 | /* RID_C99_FUNCTION_NAME */ FUNC_NAME, | |
0ba8a114 | 3509 | |
0e5921e8 | 3510 | /* C++ */ |
19552aa5 | 3511 | /* RID_BOOL */ TYPESPEC, |
0e5921e8 ZW |
3512 | /* RID_WCHAR */ 0, |
3513 | /* RID_CLASS */ 0, | |
3514 | /* RID_PUBLIC */ 0, | |
3515 | /* RID_PRIVATE */ 0, | |
3516 | /* RID_PROTECTED */ 0, | |
3517 | /* RID_TEMPLATE */ 0, | |
3518 | /* RID_NULL */ 0, | |
3519 | /* RID_CATCH */ 0, | |
3520 | /* RID_DELETE */ 0, | |
3521 | /* RID_FALSE */ 0, | |
3522 | /* RID_NAMESPACE */ 0, | |
3523 | /* RID_NEW */ 0, | |
263ee052 | 3524 | /* RID_OFFSETOF */ 0, |
0e5921e8 ZW |
3525 | /* RID_OPERATOR */ 0, |
3526 | /* RID_THIS */ 0, | |
3527 | /* RID_THROW */ 0, | |
3528 | /* RID_TRUE */ 0, | |
3529 | /* RID_TRY */ 0, | |
3530 | /* RID_TYPENAME */ 0, | |
3531 | /* RID_TYPEID */ 0, | |
3532 | /* RID_USING */ 0, | |
3533 | ||
3534 | /* casts */ | |
3535 | /* RID_CONSTCAST */ 0, | |
3536 | /* RID_DYNCAST */ 0, | |
3537 | /* RID_REINTCAST */ 0, | |
3538 | /* RID_STATCAST */ 0, | |
3539 | ||
0e5921e8 ZW |
3540 | /* Objective C */ |
3541 | /* RID_ID */ OBJECTNAME, | |
3542 | /* RID_AT_ENCODE */ ENCODE, | |
3543 | /* RID_AT_END */ END, | |
3544 | /* RID_AT_CLASS */ CLASS, | |
3545 | /* RID_AT_ALIAS */ ALIAS, | |
3546 | /* RID_AT_DEFS */ DEFS, | |
3547 | /* RID_AT_PRIVATE */ PRIVATE, | |
3548 | /* RID_AT_PROTECTED */ PROTECTED, | |
3549 | /* RID_AT_PUBLIC */ PUBLIC, | |
3550 | /* RID_AT_PROTOCOL */ PROTOCOL, | |
3551 | /* RID_AT_SELECTOR */ SELECTOR, | |
264fa2db ZL |
3552 | /* RID_AT_THROW */ AT_THROW, |
3553 | /* RID_AT_TRY */ AT_TRY, | |
3554 | /* RID_AT_CATCH */ AT_CATCH, | |
3555 | /* RID_AT_FINALLY */ AT_FINALLY, | |
3556 | /* RID_AT_SYNCHRONIZED */ AT_SYNCHRONIZED, | |
0e5921e8 ZW |
3557 | /* RID_AT_INTERFACE */ INTERFACE, |
3558 | /* RID_AT_IMPLEMENTATION */ IMPLEMENTATION | |
3559 | }; | |
3560 | ||
3561 | static void | |
f55ade6e | 3562 | init_reswords (void) |
0e5921e8 ZW |
3563 | { |
3564 | unsigned int i; | |
3565 | tree id; | |
a3eaca15 | 3566 | int mask = (flag_isoc99 ? 0 : D_C89) |
a3eaca15 NB |
3567 | | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0); |
3568 | ||
37fa72e9 | 3569 | if (!c_dialect_objc ()) |
a3eaca15 | 3570 | mask |= D_OBJC; |
0e5921e8 | 3571 | |
703ad42b | 3572 | ridpointers = ggc_calloc ((int) RID_MAX, sizeof (tree)); |
0e5921e8 ZW |
3573 | for (i = 0; i < N_reswords; i++) |
3574 | { | |
aac02f4e RH |
3575 | /* If a keyword is disabled, do not enter it into the table |
3576 | and so create a canonical spelling that isn't a keyword. */ | |
3577 | if (reswords[i].disable & mask) | |
3578 | continue; | |
3579 | ||
0e5921e8 ZW |
3580 | id = get_identifier (reswords[i].word); |
3581 | C_RID_CODE (id) = reswords[i].rid; | |
71b7be38 | 3582 | C_IS_RESERVED_WORD (id) = 1; |
0e5921e8 | 3583 | ridpointers [(int) reswords[i].rid] = id; |
0e5921e8 ZW |
3584 | } |
3585 | } | |
3586 | ||
0e5921e8 | 3587 | #define NAME(type) cpp_type2name (type) |
0e5921e8 ZW |
3588 | |
3589 | static void | |
f55ade6e | 3590 | yyerror (const char *msgid) |
0e5921e8 | 3591 | { |
4bb8ca28 | 3592 | c_parse_error (msgid, last_token, yylval.ttype); |
0e5921e8 ZW |
3593 | } |
3594 | ||
cc937581 | 3595 | static int |
f55ade6e | 3596 | yylexname (void) |
cc937581 ZW |
3597 | { |
3598 | tree decl; | |
84d901be | 3599 | |
264fa2db | 3600 | @@ifobjc |
f2e6e530 ZL |
3601 | int objc_force_identifier = objc_need_raw_identifier; |
3602 | OBJC_NEED_RAW_IDENTIFIER (0); | |
264fa2db | 3603 | @@end_ifobjc |
84d901be | 3604 | |
cc937581 ZW |
3605 | if (C_IS_RESERVED_WORD (yylval.ttype)) |
3606 | { | |
3607 | enum rid rid_code = C_RID_CODE (yylval.ttype); | |
0ba8a114 | 3608 | |
264fa2db | 3609 | @@ifobjc |
f2e6e530 ZL |
3610 | /* Turn non-typedefed refs to "id" into plain identifiers; this |
3611 | allows constructs like "void foo(id id);" to work. */ | |
3612 | if (rid_code == RID_ID) | |
3613 | { | |
3614 | decl = lookup_name (yylval.ttype); | |
3615 | if (decl == NULL_TREE || TREE_CODE (decl) != TYPE_DECL) | |
3616 | return IDENTIFIER; | |
3617 | } | |
3618 | ||
b8363a24 ZW |
3619 | if (!OBJC_IS_AT_KEYWORD (rid_code) |
3620 | && (!OBJC_IS_PQ_KEYWORD (rid_code) || objc_pq_context)) | |
264fa2db | 3621 | @@end_ifobjc |
4c521bad | 3622 | { |
4c521bad NB |
3623 | /* Return the canonical spelling for this keyword. */ |
3624 | yylval.ttype = ridpointers[(int) rid_code]; | |
e6cc3a24 | 3625 | return rid_to_yy[(int) rid_code]; |
4c521bad | 3626 | } |
cc937581 ZW |
3627 | } |
3628 | ||
3629 | decl = lookup_name (yylval.ttype); | |
3630 | if (decl) | |
3631 | { | |
3632 | if (TREE_CODE (decl) == TYPE_DECL) | |
3633 | return TYPENAME; | |
cc937581 | 3634 | } |
264fa2db | 3635 | @@ifobjc |
a3eaca15 | 3636 | else |
cc937581 ZW |
3637 | { |
3638 | tree objc_interface_decl = is_class_name (yylval.ttype); | |
f2e6e530 ZL |
3639 | /* ObjC class names are in the same namespace as variables and |
3640 | typedefs, and hence are shadowed by local declarations. */ | |
84d901be AD |
3641 | if (objc_interface_decl |
3642 | && (global_bindings_p () | |
f2e6e530 | 3643 | || (!objc_force_identifier && !decl))) |
cc937581 ZW |
3644 | { |
3645 | yylval.ttype = objc_interface_decl; | |
3646 | return CLASSNAME; | |
3647 | } | |
3648 | } | |
264fa2db | 3649 | @@end_ifobjc |
cc937581 ZW |
3650 | |
3651 | return IDENTIFIER; | |
3652 | } | |
3653 | ||
0e5921e8 | 3654 | static inline int |
f55ade6e | 3655 | _yylex (void) |
0e5921e8 | 3656 | { |
cc937581 | 3657 | get_next: |
0e5921e8 | 3658 | last_token = c_lex (&yylval.ttype); |
0e5921e8 ZW |
3659 | switch (last_token) |
3660 | { | |
3661 | case CPP_EQ: return '='; | |
3662 | case CPP_NOT: return '!'; | |
3663 | case CPP_GREATER: yylval.code = GT_EXPR; return ARITHCOMPARE; | |
3664 | case CPP_LESS: yylval.code = LT_EXPR; return ARITHCOMPARE; | |
3665 | case CPP_PLUS: yylval.code = PLUS_EXPR; return '+'; | |
3666 | case CPP_MINUS: yylval.code = MINUS_EXPR; return '-'; | |
3667 | case CPP_MULT: yylval.code = MULT_EXPR; return '*'; | |
3668 | case CPP_DIV: yylval.code = TRUNC_DIV_EXPR; return '/'; | |
3669 | case CPP_MOD: yylval.code = TRUNC_MOD_EXPR; return '%'; | |
3670 | case CPP_AND: yylval.code = BIT_AND_EXPR; return '&'; | |
3671 | case CPP_OR: yylval.code = BIT_IOR_EXPR; return '|'; | |
3672 | case CPP_XOR: yylval.code = BIT_XOR_EXPR; return '^'; | |
3673 | case CPP_RSHIFT: yylval.code = RSHIFT_EXPR; return RSHIFT; | |
3674 | case CPP_LSHIFT: yylval.code = LSHIFT_EXPR; return LSHIFT; | |
3675 | ||
3676 | case CPP_COMPL: return '~'; | |
3677 | case CPP_AND_AND: return ANDAND; | |
3678 | case CPP_OR_OR: return OROR; | |
3679 | case CPP_QUERY: return '?'; | |
0e5921e8 | 3680 | case CPP_OPEN_PAREN: return '('; |
0e5921e8 ZW |
3681 | case CPP_EQ_EQ: yylval.code = EQ_EXPR; return EQCOMPARE; |
3682 | case CPP_NOT_EQ: yylval.code = NE_EXPR; return EQCOMPARE; | |
3683 | case CPP_GREATER_EQ:yylval.code = GE_EXPR; return ARITHCOMPARE; | |
3684 | case CPP_LESS_EQ: yylval.code = LE_EXPR; return ARITHCOMPARE; | |
3685 | ||
3686 | case CPP_PLUS_EQ: yylval.code = PLUS_EXPR; return ASSIGN; | |
3687 | case CPP_MINUS_EQ: yylval.code = MINUS_EXPR; return ASSIGN; | |
3688 | case CPP_MULT_EQ: yylval.code = MULT_EXPR; return ASSIGN; | |
3689 | case CPP_DIV_EQ: yylval.code = TRUNC_DIV_EXPR; return ASSIGN; | |
3690 | case CPP_MOD_EQ: yylval.code = TRUNC_MOD_EXPR; return ASSIGN; | |
3691 | case CPP_AND_EQ: yylval.code = BIT_AND_EXPR; return ASSIGN; | |
3692 | case CPP_OR_EQ: yylval.code = BIT_IOR_EXPR; return ASSIGN; | |
3693 | case CPP_XOR_EQ: yylval.code = BIT_XOR_EXPR; return ASSIGN; | |
3694 | case CPP_RSHIFT_EQ: yylval.code = RSHIFT_EXPR; return ASSIGN; | |
3695 | case CPP_LSHIFT_EQ: yylval.code = LSHIFT_EXPR; return ASSIGN; | |
3696 | ||
3697 | case CPP_OPEN_SQUARE: return '['; | |
3698 | case CPP_CLOSE_SQUARE: return ']'; | |
3699 | case CPP_OPEN_BRACE: return '{'; | |
3700 | case CPP_CLOSE_BRACE: return '}'; | |
0e5921e8 ZW |
3701 | case CPP_ELLIPSIS: return ELLIPSIS; |
3702 | ||
3703 | case CPP_PLUS_PLUS: return PLUSPLUS; | |
3704 | case CPP_MINUS_MINUS: return MINUSMINUS; | |
3705 | case CPP_DEREF: return POINTSAT; | |
3706 | case CPP_DOT: return '.'; | |
3707 | ||
f2e6e530 ZL |
3708 | /* The following tokens may affect the interpretation of any |
3709 | identifiers following, if doing Objective-C. */ | |
3710 | case CPP_COLON: OBJC_NEED_RAW_IDENTIFIER (0); return ':'; | |
3711 | case CPP_COMMA: OBJC_NEED_RAW_IDENTIFIER (0); return ','; | |
3712 | case CPP_CLOSE_PAREN: OBJC_NEED_RAW_IDENTIFIER (0); return ')'; | |
3713 | case CPP_SEMICOLON: OBJC_NEED_RAW_IDENTIFIER (0); return ';'; | |
3714 | ||
0e5921e8 | 3715 | case CPP_EOF: |
ef6e958a | 3716 | return 0; |
0e5921e8 ZW |
3717 | |
3718 | case CPP_NAME: | |
e6cc3a24 ZW |
3719 | return yylexname (); |
3720 | ||
3721 | case CPP_AT_NAME: | |
3722 | /* This only happens in Objective-C; it must be a keyword. */ | |
3723 | return rid_to_yy [(int) C_RID_CODE (yylval.ttype)]; | |
0e5921e8 | 3724 | |
0e5921e8 ZW |
3725 | case CPP_NUMBER: |
3726 | case CPP_CHAR: | |
3727 | case CPP_WCHAR: | |
3728 | return CONSTANT; | |
3729 | ||
3730 | case CPP_STRING: | |
3731 | case CPP_WSTRING: | |
e6cc3a24 | 3732 | return STRING; |
e13e48e7 | 3733 | |
e6cc3a24 ZW |
3734 | case CPP_OBJC_STRING: |
3735 | return OBJC_STRING; | |
b8363a24 | 3736 | |
0e5921e8 ZW |
3737 | /* These tokens are C++ specific (and will not be generated |
3738 | in C mode, but let's be cautious). */ | |
3739 | case CPP_SCOPE: | |
3740 | case CPP_DEREF_STAR: | |
3741 | case CPP_DOT_STAR: | |
3742 | case CPP_MIN_EQ: | |
3743 | case CPP_MAX_EQ: | |
3744 | case CPP_MIN: | |
3745 | case CPP_MAX: | |
3746 | /* These tokens should not survive translation phase 4. */ | |
3747 | case CPP_HASH: | |
3748 | case CPP_PASTE: | |
cc937581 ZW |
3749 | error ("syntax error at '%s' token", NAME(last_token)); |
3750 | goto get_next; | |
0e5921e8 ZW |
3751 | |
3752 | default: | |
3753 | abort (); | |
3754 | } | |
0e5921e8 ZW |
3755 | /* NOTREACHED */ |
3756 | } | |
3757 | ||
3758 | static int | |
f55ade6e | 3759 | yylex (void) |
0e5921e8 ZW |
3760 | { |
3761 | int r; | |
3762 | timevar_push (TV_LEX); | |
3763 | r = _yylex(); | |
3764 | timevar_pop (TV_LEX); | |
3765 | return r; | |
3766 | } | |
3767 | ||
0e5921e8 ZW |
3768 | /* Function used when yydebug is set, to print a token in more detail. */ |
3769 | ||
3770 | static void | |
f55ade6e | 3771 | yyprint (FILE *file, int yychar, YYSTYPE yyl) |
0e5921e8 ZW |
3772 | { |
3773 | tree t = yyl.ttype; | |
3774 | ||
3775 | fprintf (file, " [%s]", NAME(last_token)); | |
84d901be | 3776 | |
0e5921e8 ZW |
3777 | switch (yychar) |
3778 | { | |
3779 | case IDENTIFIER: | |
3780 | case TYPENAME: | |
3781 | case OBJECTNAME: | |
3782 | case TYPESPEC: | |
3783 | case TYPE_QUAL: | |
3784 | case SCSPEC: | |
f79f2651 | 3785 | case STATIC: |
0e5921e8 ZW |
3786 | if (IDENTIFIER_POINTER (t)) |
3787 | fprintf (file, " `%s'", IDENTIFIER_POINTER (t)); | |
3788 | break; | |
3789 | ||
3790 | case CONSTANT: | |
3791 | fprintf (file, " %s", GET_MODE_NAME (TYPE_MODE (TREE_TYPE (t)))); | |
3792 | if (TREE_CODE (t) == INTEGER_CST) | |
c14bc6db AJ |
3793 | { |
3794 | fputs (" ", file); | |
3795 | fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, | |
3796 | TREE_INT_CST_HIGH (t), TREE_INT_CST_LOW (t)); | |
3797 | } | |
0e5921e8 ZW |
3798 | break; |
3799 | } | |
3800 | } | |
3801 | \f | |
3802 | /* This is not the ideal place to put these, but we have to get them out | |
3803 | of c-lex.c because cp/lex.c has its own versions. */ | |
3804 | ||
d1bd0ded GK |
3805 | /* Parse the file. */ |
3806 | void | |
3807 | c_parse_file (void) | |
3808 | { | |
3809 | yyparse (); | |
3810 | /* In case there were missing closebraces, get us back to the global | |
3811 | binding level. */ | |
3812 | while (! global_bindings_p ()) | |
3813 | poplevel (0, 0, 0); | |
3814 | /* __FUNCTION__ is defined at file scope (""). This | |
3815 | call may not be necessary as my tests indicate it | |
3816 | still works without it. */ | |
3817 | finish_fname_decls (); | |
3818 | ||
94a50397 RH |
3819 | if (malloced_yyss) |
3820 | { | |
3821 | free (malloced_yyss); | |
3822 | free (malloced_yyvs); | |
d1bd0ded | 3823 | malloced_yyss = 0; |
94a50397 RH |
3824 | } |
3825 | } | |
e2500fed GK |
3826 | |
3827 | #include "gt-c-parse.h" |