diff options
author | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-02-28 18:51:14 +0000 |
---|---|---|
committer | neil <neil@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-02-28 18:51:14 +0000 |
commit | d799a7a075eb0c87aec3ada6c1f6a675e339c0b3 (patch) | |
tree | 2243c7a0b1d7e4ced64a5a18ca4083f462757e95 /gcc/c-parse.in | |
parent | 0b3481a41f58a6291f2b47eb10b4013081b4a07a (diff) | |
download | gcc-d799a7a075eb0c87aec3ada6c1f6a675e339c0b3.tar.gz |
* c-parse.in (STATIC): New terminal.
(scspec): New non-terminal. Update productions accordingly.
(program): Remove bogus ifc / end ifc.
(array_declarator): Simplify production using STATIC.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@50155 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-parse.in')
-rw-r--r-- | gcc/c-parse.in | 85 |
1 files changed, 40 insertions, 45 deletions
diff --git a/gcc/c-parse.in b/gcc/c-parse.in index bae43d5761d..80e4ca86219 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -85,7 +85,8 @@ end ifobjc /* Reserved words that specify storage class. yylval contains an IDENTIFIER_NODE which indicates which one. */ -%token SCSPEC +%token SCSPEC /* Storage class other than static. */ +%token STATIC /* Static storage class. */ /* Reserved words that specify type. yylval contains an IDENTIFIER_NODE which indicates which one. */ @@ -167,7 +168,7 @@ end ifobjc %type <ttype> typespec_reserved_nonattr typespec_reserved_attr %type <ttype> typespec_nonreserved_nonattr -%type <ttype> SCSPEC TYPESPEC TYPE_QUAL maybe_type_qual +%type <ttype> scspec SCSPEC STATIC TYPESPEC TYPE_QUAL maybe_type_qual %type <ttype> initdecls notype_initdecls initdcl notype_initdcl %type <ttype> init maybeasm %type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers @@ -329,9 +330,10 @@ program: /* empty */ get us back to the global binding level. */ while (! global_bindings_p ()) poplevel (0, 0, 0); -ifc + /* __FUNCTION__ is defined at file scope (""). This + call may not be necessary as my tests indicate it + still works without it. */ finish_fname_decls (); -end ifc finish_file (); } ; @@ -854,7 +856,7 @@ decl: /* A list of declaration specifiers. These are: - - Storage class specifiers (SCSPEC), which for GCC currently include + - Storage class specifiers (scspec), which for GCC currently includes function specifiers ("inline"). - Type specifiers (typespec_*). @@ -1025,7 +1027,7 @@ declspecs_nosc_ts_sa_ea: ; declspecs_sc_nots_nosa_noea: - SCSPEC + scspec { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); TREE_STATIC ($$) = 0; } | declspecs_sc_nots_nosa_noea TYPE_QUAL @@ -1034,25 +1036,25 @@ declspecs_sc_nots_nosa_noea: | declspecs_sc_nots_nosa_ea TYPE_QUAL { $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = 1; } - | declspecs_nosc_nots_nosa_noea SCSPEC + | declspecs_nosc_nots_nosa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_nosc_nots_nosa_ea SCSPEC + | declspecs_nosc_nots_nosa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_nots_nosa_noea SCSPEC + | declspecs_sc_nots_nosa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_nots_nosa_ea SCSPEC + | declspecs_sc_nots_nosa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); @@ -1073,25 +1075,25 @@ declspecs_sc_nots_sa_noea: | declspecs_sc_nots_sa_ea TYPE_QUAL { $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = 1; } - | declspecs_nosc_nots_sa_noea SCSPEC + | declspecs_nosc_nots_sa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_nosc_nots_sa_ea SCSPEC + | declspecs_nosc_nots_sa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_nots_sa_noea SCSPEC + | declspecs_sc_nots_sa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_nots_sa_ea SCSPEC + | declspecs_sc_nots_sa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); @@ -1124,25 +1126,25 @@ declspecs_sc_ts_nosa_noea: | declspecs_sc_nots_nosa_ea typespec_nonattr { $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = 1; } - | declspecs_nosc_ts_nosa_noea SCSPEC + | declspecs_nosc_ts_nosa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_nosc_ts_nosa_ea SCSPEC + | declspecs_nosc_ts_nosa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_ts_nosa_noea SCSPEC + | declspecs_sc_ts_nosa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_ts_nosa_ea SCSPEC + | declspecs_sc_ts_nosa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); @@ -1187,25 +1189,25 @@ declspecs_sc_ts_sa_noea: | declspecs_sc_nots_sa_ea typespec_nonattr { $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = 1; } - | declspecs_nosc_ts_sa_noea SCSPEC + | declspecs_nosc_ts_sa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_nosc_ts_sa_ea SCSPEC + | declspecs_nosc_ts_sa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_ts_sa_noea SCSPEC + | declspecs_sc_ts_sa_noea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); $$ = tree_cons (NULL_TREE, $2, $1); TREE_STATIC ($$) = TREE_STATIC ($1); } - | declspecs_sc_ts_sa_ea SCSPEC + | declspecs_sc_ts_sa_ea scspec { if (extra_warnings && TREE_STATIC ($1)) warning ("`%s' is not at beginning of declaration", IDENTIFIER_POINTER ($2)); @@ -1479,10 +1481,15 @@ attrib: any_word: identifier - | SCSPEC + | scspec | TYPESPEC | TYPE_QUAL ; + +scspec: + STATIC + | SCSPEC + ; /* Initializers. `init' is the entry point. */ @@ -1972,30 +1979,17 @@ direct_absdcl1: /* The [...] part of a declarator for an array type. */ array_declarator: - '[' expr ']' - { $$ = build_array_declarator ($2, NULL_TREE, 0, 0); } - | '[' declspecs_nosc expr ']' + '[' maybe_type_quals_attrs expr ']' { $$ = build_array_declarator ($3, $2, 0, 0); } - | '[' ']' - { $$ = build_array_declarator (NULL_TREE, NULL_TREE, 0, 0); } - | '[' declspecs_nosc ']' + | '[' maybe_type_quals_attrs ']' { $$ = build_array_declarator (NULL_TREE, $2, 0, 0); } - | '[' '*' ']' - { $$ = build_array_declarator (NULL_TREE, NULL_TREE, 0, 1); } - | '[' declspecs_nosc '*' ']' + | '[' maybe_type_quals_attrs '*' ']' { $$ = build_array_declarator (NULL_TREE, $2, 0, 1); } - | '[' SCSPEC expr ']' - { if (C_RID_CODE ($2) != RID_STATIC) - error ("storage class specifier in array declarator"); - $$ = build_array_declarator ($3, NULL_TREE, 1, 0); } - | '[' SCSPEC declspecs_nosc expr ']' - { if (C_RID_CODE ($2) != RID_STATIC) - error ("storage class specifier in array declarator"); - $$ = build_array_declarator ($4, $3, 1, 0); } - | '[' declspecs_nosc SCSPEC expr ']' - { if (C_RID_CODE ($3) != RID_STATIC) - error ("storage class specifier in array declarator"); - $$ = build_array_declarator ($4, $2, 1, 0); } + | '[' STATIC maybe_type_quals_attrs expr ']' + { $$ = build_array_declarator ($4, $3, 1, 0); } + /* declspecs_nosc_nots is a synonym for type_quals_attrs. */ + | '[' declspecs_nosc_nots STATIC expr ']' + { $$ = build_array_declarator ($4, $2, 1, 0); } ; /* A nonempty series of declarations and statements (possibly followed by @@ -3402,7 +3396,7 @@ end ifobjc three languages. */ static const short rid_to_yy[RID_MAX] = { - /* RID_STATIC */ SCSPEC, + /* RID_STATIC */ STATIC, /* RID_UNSIGNED */ TYPESPEC, /* RID_LONG */ TYPESPEC, /* RID_CONST */ TYPE_QUAL, @@ -3835,6 +3829,7 @@ yyprint (file, yychar, yyl) case TYPESPEC: case TYPE_QUAL: case SCSPEC: + case STATIC: if (IDENTIFIER_POINTER (t)) fprintf (file, " `%s'", IDENTIFIER_POINTER (t)); break; |