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