This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: c: array_declarator production simplification
- From: Stan Shebs <shebs at apple dot com>
- To: Neil Booth <neil at daikokuya dot demon dot co dot uk>
- Cc: gcc-patches at gcc dot gnu dot org, "Joseph S. Myers" <jsm28 at cam dot ac dot uk>
- Date: Thu, 28 Feb 2002 10:18:24 -0800
- Subject: Re: c: array_declarator production simplification
- References: <20020227184112.GA30162@daikokuya.demon.co.uk>
Neil Booth wrote:
>
> This patch simplifies the production for array_declarator. It also
> removes a bogus ifc/end ifc that should be being done for ObjC if it is
> also being done for C.
>
> This has been bootstrapping for me for quite a while. OK?
This is OK for ObjC too, at least I can't come up with a reason for
the ifc. (I would like to kill the whole ifc/ifobjc nonsense actually,
been working on this in the background.)
Stan
> Neil.
>
> * 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.
>
> Index: c-parse.in
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/c-parse.in,v
> retrieving revision 1.127
> diff -u -p -r1.127 c-parse.in
> --- c-parse.in 2002/02/08 07:51:10 1.127
> +++ c-parse.in 2002/02/27 07:32:53
> @@ -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
> @@ -3403,7 +3397,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,
> @@ -3837,6 +3831,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;