]> gcc.gnu.org Git - gcc.git/blame - gcc/c-parse.in
re PR c/11658 (Wrong error message)
[gcc.git] / gcc / c-parse.in
CommitLineData
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 5This file is part of GCC.
028299c6 6
1322177d
LB
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
028299c6 11
1322177d
LB
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
028299c6
RS
16
17You should have received a copy of the GNU General Public License
1322177d
LB
18along with GCC; see the file COPYING. If not, write to the Free
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-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
68static short *malloced_yyss;
69static void *malloced_yyvs;
70
71#define yyoverflow(MSG, SS, SSSIZE, VS, VSSIZE, YYSSZ) \
72do { \
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 258static int stmt_count;
818e50a5 259static 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
263static location_t if_stmt_locus;
264
028299c6
RS
265
266/* List of types and structure classes of the current declaration. */
e2500fed
GK
267static GTY(()) tree current_declspecs;
268static 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 273static GTY(()) tree all_prefix_attributes;
4b01f8d8
JM
274
275/* Stack of saved values of current_declspecs, prefix_attributes and
276 all_prefix_attributes. */
e2500fed 277static 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
316static enum tree_code objc_inherit_code;
317static 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 323static 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
331static 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
337static void yyprint (FILE *, int, YYSTYPE);
338static void yyerror (const char *);
339static int yylexname (void);
340static inline int _yylex (void);
341static int yylex (void);
342static void init_reswords (void);
1526a060 343
e2500fed 344 /* Initialisation routine for this file. */
1526a060 345void
f55ade6e 346c_parse_init (void)
1526a060 347{
f5e99456 348 init_reswords ();
1526a060
BS
349}
350
028299c6
RS
351%}
352\f
353%%
354program: /* 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
365extdefs:
366 {$<ttype>$ = NULL_TREE; } extdef
fbddce27 367 | extdefs {$<ttype>$ = NULL_TREE; ggc_collect(); } extdef
028299c6
RS
368 ;
369
370extdef:
622d3731
KG
371 extdef_1
372 { parsing_iso_function_signature = false; } /* Reset after any external definition. */
17f44f02 373 ;
622d3731
KG
374
375extdef_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
393datadef:
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
414fndef:
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
456identifier:
457 IDENTIFIER
458 | TYPENAME
264fa2db 459@@ifobjc
e31c7eec 460 | OBJECTNAME
f2e6e530 461 | CLASSNAME
264fa2db 462@@end_ifobjc
028299c6
RS
463 ;
464
465unop: '&'
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
486expr: nonnull_exprlist
487 { $$ = build_compound_expr ($1); }
488 ;
489
490exprlist:
491 /* empty */
492 { $$ = NULL_TREE; }
493 | nonnull_exprlist
494 ;
495
496nonnull_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
503unary_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
538sizeof:
539 SIZEOF { skip_evaluation++; }
540 ;
541
542alignof:
543 ALIGNOF { skip_evaluation++; }
544 ;
545
25587e40
AO
546typeof:
547 TYPEOF { skip_evaluation++; }
548 ;
549
028299c6
RS
550cast_expr:
551 unary_expr
552 | '(' typename ')' cast_expr %prec UNARY
15b732b2 553 { $$ = c_cast_expr ($2, $4); }
028299c6
RS
554 ;
555
556expr_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
634primary:
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 750old_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
757old_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. */
778lineno_datadecl:
374a4e6c 779 save_location datadecl
028299c6
RS
780 { }
781 ;
782
783datadecls:
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 794datadecl:
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. */
810lineno_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. */
819setspecs: /* empty */
4dd7201e 820 { pending_xref_error ();
4b01f8d8 821 PUSH_DECLSPEC_STACK;
084c4c25 822 split_specs_attrs ($<ttype>0,
4b01f8d8
JM
823 &current_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. */
829maybe_resetattrs:
91d231cb
JM
830 maybe_attribute
831 { all_prefix_attributes = chainon ($1, prefix_attributes); }
4b01f8d8
JM
832 ;
833
028299c6 834decl:
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
901declspecs_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
913declspecs_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
919declspecs_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
928declspecs_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
937declspecs_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
961declspecs_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
982declspecs_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
1003declspecs_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
1021declspecs_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
1057declspecs_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
1063declspecs_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
1096declspecs_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
1102declspecs_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
1147declspecs_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
1165declspecs_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
1210declspecs_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. */
1229declspecs_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
1240declspecs_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
1251declspecs_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
1258declspecs_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
1265declspecs_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
1272declspecs_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
1279declspecs_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
1290declspecs:
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. */
1310maybe_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
1338typespec_nonattr:
1339 typespec_reserved_nonattr
1340 | typespec_nonreserved_nonattr
1341 ;
1342
1343typespec_attr:
1344 typespec_reserved_attr
1345 ;
1346
1347typespec_reserved_nonattr:
1348 TYPESPEC
f2e6e530 1349 { OBJC_NEED_RAW_IDENTIFIER (1); }
25d78ace
JM
1350 | structsp_nonattr
1351 ;
1352
1353typespec_reserved_attr:
1354 structsp_attr
1355 ;
1356
1357typespec_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
1385initdecls:
1386 initdcl
4b01f8d8 1387 | initdecls ',' maybe_resetattrs initdcl
028299c6
RS
1388 ;
1389
1390notype_initdecls:
1391 notype_initdcl
4b01f8d8 1392 | notype_initdecls ',' maybe_resetattrs notype_initdcl
028299c6
RS
1393 ;
1394
1395maybeasm:
1396 /* empty */
1397 { $$ = NULL_TREE; }
b84a3874
RH
1398 | ASM_KEYWORD '(' STRING ')'
1399 { $$ = $3; }
028299c6
RS
1400 ;
1401
1402initdcl:
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
1418notype_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. */
1434maybe_attribute:
660b43c8 1435 /* empty */
c14bc6db 1436 { $$ = NULL_TREE; }
660b43c8
RK
1437 | attributes
1438 { $$ = $1; }
1439 ;
84d901be 1440
660b43c8
RK
1441attributes:
1442 attribute
1443 { $$ = $1; }
1444 | attributes attribute
1445 { $$ = chainon ($1, $2); }
1446 ;
1447
1448attribute:
1449 ATTRIBUTE '(' '(' attribute_list ')' ')'
1450 { $$ = $4; }
1451 ;
1452
1453attribute_list:
1454 attrib
5d7a33dc 1455 { $$ = $1; }
660b43c8 1456 | attribute_list ',' attrib
5d7a33dc 1457 { $$ = chainon ($1, $3); }
660b43c8 1458 ;
84d901be 1459
660b43c8 1460attrib:
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
1476any_word:
1477 identifier
f79f2651 1478 | scspec
660b43c8
RK
1479 | TYPESPEC
1480 | TYPE_QUAL
1481 ;
f79f2651
NB
1482
1483scspec:
1484 STATIC
1485 | SCSPEC
1486 ;
42e651a6
RS
1487\f
1488/* Initializers. `init' is the entry point. */
028299c6
RS
1489
1490init:
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. */
1501initlist_maybe_comma:
1502 /* empty */
1503 { if (pedantic)
89abf8d1 1504 pedwarn ("ISO C forbids empty initializer braces"); }
42e651a6
RS
1505 | initlist1 maybecomma
1506 ;
1507
1508initlist1:
1509 initelt
1510 | initlist1 ',' initelt
1511 ;
1512
1513/* `initelt' is a single element of an initializer.
1514 It may use braces. */
1515initelt:
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
1531initval:
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
1541designator_list:
1542 designator
1543 | designator_list designator
1544 ;
1545
1546designator:
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 1557nested_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
1588notype_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
1622declarator:
1623 after_type_declarator
1624 | notype_declarator
1625 ;
1626
1627/* A declarator that is allowed only after an explicit typespec. */
1628
1629after_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 1651parm_declarator:
97d24516
JM
1652 parm_declarator_starttypename
1653 | parm_declarator_nostarttypename
1654 ;
1655
1656parm_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
1670parm_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
1689notype_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
1704struct_head:
1705 STRUCT
1706 { $$ = NULL_TREE; }
1707 | STRUCT attributes
1708 { $$ = $2; }
1709 ;
1710
1711union_head:
1712 UNION
1713 { $$ = NULL_TREE; }
1714 | UNION attributes
1715 { $$ = $2; }
1716 ;
1717
1718enum_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
1731structsp_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
1764structsp_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
1777maybecomma:
1778 /* empty */
1779 | ','
1780 ;
1781
1782maybecomma_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
1801component_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
1809component_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 1823component_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
1852components:
1853 component_declarator
4b01f8d8 1854 | components ',' maybe_resetattrs component_declarator
66ea6f4c 1855 { TREE_CHAIN ($4) = $1; $$ = $4; }
25d78ace
JM
1856 ;
1857
1858components_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
1864component_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 1879component_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
1897enumlist:
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
1909enumerator:
1910 identifier
1911 { $$ = build_enumerator ($1, NULL_TREE); }
1912 | identifier '=' expr_no_commas
1913 { $$ = build_enumerator ($1, $3); }
1914 ;
1915
1916typename:
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
1924absdcl: /* an absolute declarator */
1925 /* empty */
1926 { $$ = NULL_TREE; }
1927 | absdcl1
1928 ;
1929
25d78ace
JM
1930absdcl_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
1945absdcl1: /* a nonempty absolute declarator */
1946 absdcl1_ea
1947 | absdcl1_noea
028299c6
RS
1948 ;
1949
25d78ace
JM
1950absdcl1_noea:
1951 direct_absdcl1
91d231cb 1952 | '*' maybe_type_quals_attrs absdcl1_noea
028299c6 1953 { $$ = make_pointer_declarator ($2, $3); }
25d78ace
JM
1954 ;
1955
1956absdcl1_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
1963direct_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
1978array_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
1998stmts_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
2008lineno_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
2016lineno_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
2028lineno_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
2036lineno_stmt_decl_or_labels_ending_error:
2037 errstmt
2038 | lineno_stmt_decl_or_labels errstmt
2039 ;
2040
2041lineno_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
2048errstmt: error ';'
2049 ;
2050
2051pushlevel: /* 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 2058poplevel: /* 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. */
2069c99_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. */
2085c99_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. */
2100maybe_label_decls:
2101 /* empty */
2102 | label_decls
2103 { if (pedantic)
89abf8d1 2104 pedwarn ("ISO C forbids label declarations"); }
028299c6
RS
2105 ;
2106
2107label_decls:
2108 label_decl
2109 | label_decls label_decl
2110 ;
2111
2112label_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. */
2126compstmt_or_error:
2127 compstmt
2128 {}
2129 | error compstmt
2130 ;
2131
8f17b5c5 2132compstmt_start: '{' { compstmt_count++;
7d6f6369
PC
2133 $$ = c_begin_compound_stmt (); }
2134 ;
818e50a5 2135
d0668a73 2136compstmt_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
2145compstmt_contents_nonempty:
2146 stmts_and_decls
2147 | error
2148 ;
2149
d0668a73
RH
2150compstmt_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
2167compstmt: 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. */
2174simple_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
2183if_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. */
2204do_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 2227save_location:
0e5921e8
ZW
2228 { if (yychar == YYEMPTY)
2229 yychar = YYLEX;
374a4e6c 2230 $$ = input_location; }
028299c6
RS
2231 ;
2232
2233lineno_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. */
2239c99_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 2245lineno_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 2259lineno_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
2268select_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
2342for_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. */
2350stmt:
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
2440objc_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
2450objc_try_stmt:
e13e48e7 2451 AT_TRY
264fa2db 2452 { objc_build_try_prologue (); }
e13e48e7 2453 compstmt
264fa2db 2454 ;
e13e48e7 2455
264fa2db
ZL
2456objc_catch_list:
2457 objc_catch_list objc_catch_block
2458 | objc_catch_block
2459 ;
2460
2461objc_catch_block:
e13e48e7 2462 AT_CATCH '(' parm ')'
264fa2db
ZL
2463 { objc_build_catch_stmt ($3); }
2464 compstmt
2465 { stmt_count++; }
2466 ;
2467
2468objc_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 2480label: 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
2504maybe_type_qual:
2505 /* empty */
0de456a5 2506 { $$ = NULL_TREE; }
028299c6 2507 | TYPE_QUAL
0de456a5 2508 { }
028299c6
RS
2509 ;
2510
2511xexpr:
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)) */
2519asm_operands: /* empty */
2520 { $$ = NULL_TREE; }
2521 | nonnull_asm_operands
2522 ;
2523
2524nonnull_asm_operands:
2525 asm_operand
2526 | nonnull_asm_operands ',' asm_operand
2527 { $$ = chainon ($1, $3); }
2528 ;
2529
2530asm_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
2539asm_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 2551parmlist:
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
2560parmlist_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. */
2575parmlist_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
2598parms:
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. */
2607parm:
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. */
2634firstparm:
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
2659setspecs_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. */
2668parmlist_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
2677parmlist_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. */
2696identifiers:
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. */
2704identifiers_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
2711extension:
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
2723objcdef:
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. */
2743identifier_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
2750classdecl:
2751 CLASS identifier_list ';'
2752 {
2753 objc_declare_class ($2);
2754 }
84d901be 2755 ;
e31c7eec
TW
2756
2757aliasdecl:
2758 ALIAS identifier identifier ';'
2759 {
2760 objc_declare_alias ($2, $3);
2761 }
84d901be 2762 ;
e31c7eec 2763
264fa2db
ZL
2764superclass:
2765 ':' identifier { $$ = $2; }
2766 | /* NULL */ %prec HYPERUNARY { $$ = NULL_TREE; }
2767 ;
028299c6 2768
264fa2db
ZL
2769class_ivars:
2770 '{' ivar_decl_list '}'
2771 | /* NULL */
2772 ;
028299c6 2773
264fa2db
ZL
2774classdef:
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
2824protocoldef:
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
2846protocolrefs:
2847 /* empty */
2848 {
2849 $$ = NULL_TREE;
2850 }
957a1c32
RK
2851 | non_empty_protocolrefs
2852 ;
2853
2854non_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 2864ivar_decl_list:
e31c7eec 2865 ivar_decl_list visibility_spec ivar_decls
028299c6
RS
2866 | ivar_decls
2867 ;
2868
e31c7eec
TW
2869visibility_spec:
2870 PRIVATE { objc_public_flag = 2; }
2871 | PROTECTED { objc_public_flag = 0; }
2872 | PUBLIC { objc_public_flag = 1; }
2873 ;
2874
028299c6
RS
2875ivar_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
2898ivar_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
2909ivars:
2910 /* empty */
2911 { $$ = NULL_TREE; }
2912 | ivar_declarator
4b01f8d8 2913 | ivars ',' maybe_resetattrs ivar_declarator
028299c6
RS
2914 ;
2915
2916ivar_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 2939methodtype:
028299c6 2940 '+'
0b1cdaf2 2941 { objc_inherit_code = CLASS_METHOD_DECL; }
028299c6 2942 | '-'
0b1cdaf2
NB
2943 { objc_inherit_code = INSTANCE_METHOD_DECL; }
2944 ;
2945
2946methoddef:
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
2975methodprotolist:
2976 /* empty */
264fa2db
ZL
2977 | methodprotolist methodproto
2978 | methodprotolist { $<ttype>$ = NULL_TREE; } datadef
028299c6
RS
2979 ;
2980
2981semi_or_error:
2982 ';'
2983 | error
2984 ;
2985
2986methodproto:
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
3003methoddecl:
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
3028optarglist:
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
3036myxdecls:
3037 /* empty */
3038 | mydecls
3039 ;
3040
3041mydecls:
3042 mydecl
3043 | errstmt
3044 | mydecls mydecl
3045 | mydecl errstmt
3046 ;
3047
3048mydecl:
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
3057myparms:
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
3067myparm:
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
3080optparmlist:
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
3102unaryselector:
3103 selector
3104 ;
3105
3106keywordselector:
3107 keyworddecl
3108
3109 | keywordselector keyworddecl
3110 {
3111 $$ = chainon ($1, $2);
3112 }
3113 ;
3114
3115selector:
3116 IDENTIFIER
f2e6e530
ZL
3117 | TYPENAME
3118 | CLASSNAME
3119 | OBJECTNAME
028299c6
RS
3120 | reservedwords
3121 ;
3122
3123reservedwords:
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
3130keyworddecl:
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
3152messageargs:
3153 selector
3154 | keywordarglist
3155 ;
3156
3157keywordarglist:
3158 keywordarg
3159 | keywordarglist keywordarg
3160 {
3161 $$ = chainon ($1, $2);
3162 }
3163 ;
3164
3165
3166keywordexpr:
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
3178keywordarg:
3179 selector ':' keywordexpr
3180 {
3181 $$ = build_tree_list ($1, $3);
3182 }
3183 | ':' keywordexpr
3184 {
3185 $$ = build_tree_list (NULL_TREE, $2);
3186 }
3187 ;
3188
3189receiver:
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
3201objcmessageexpr:
c1c5187c
ZL
3202 '[' receiver messageargs ']'
3203 { $$ = build_tree_list ($2, $3); }
028299c6
RS
3204 ;
3205
3206selectorarg:
3207 selector
3208 | keywordnamelist
3209 ;
3210
3211keywordnamelist:
3212 keywordname
3213 | keywordnamelist keywordname
3214 {
3215 $$ = chainon ($1, $2);
3216 }
3217 ;
3218
3219keywordname:
3220 selector ':'
3221 {
3222 $$ = build_tree_list ($1, NULL_TREE);
3223 }
3224 | ':'
3225 {
3226 $$ = build_tree_list (NULL_TREE, NULL_TREE);
3227 }
3228 ;
3229
3230objcselectorexpr:
3231 SELECTOR '(' selectorarg ')'
3232 {
3233 $$ = $3;
3234 }
3235 ;
3236
e31c7eec
TW
3237objcprotocolexpr:
3238 PROTOCOL '(' identifier ')'
3239 {
3240 $$ = $3;
3241 }
3242 ;
3243
028299c6
RS
3244/* extension to support C-structures in the archiver */
3245
3246objcencodeexpr:
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
3259static enum cpp_ttype last_token;
0e5921e8
ZW
3260
3261/* The reserved keyword table. */
3262struct 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
3276static 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. */
3392static 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
3522static void
f55ade6e 3523init_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
3550static void
f55ade6e 3551yyerror (const char *msgid)
0e5921e8 3552{
4bb8ca28 3553 c_parse_error (msgid, last_token, yylval.ttype);
0e5921e8
ZW
3554}
3555
cc937581 3556static int
f55ade6e 3557yylexname (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 3615static 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
3719static int
f55ade6e 3720yylex (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
3731static void
f55ade6e 3732yyprint (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
3768void
f55ade6e 3769free_parser_stacks (void)
94a50397 3770{
d1bd0ded
GK
3771}
3772
3773/* Parse the file. */
3774void
3775c_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"
This page took 1.83713 seconds and 5 git commands to generate.