On Thu, Jun 27, 2024 at 11:06:51AM +0000, Uecker, Martin wrote: > > Next version with the improved location. I assume the [PATCH] > should become part of the commit message. Just the "c: ..." part please. > Bootstrapped and regression tested on x86_64.
Thanks, this patch is OK. > c: Error message for incorrect use of static in array declarations. > > Add an explicit error messages when c99's static is > used without a size expression in an array declarator. > > gcc/c: > c-parser.cc (c_parser_direct_declarator_inner): Add > error message. > > gcc/testsuite: > gcc.dg/c99-arraydecl-4.c: New test. > > diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc > index 6a3f96d5b61..8c4e697a4e1 100644 > --- a/gcc/c/c-parser.cc > +++ b/gcc/c/c-parser.cc > @@ -4715,8 +4715,6 @@ c_parser_direct_declarator_inner (c_parser *parser, > bool id_present, > location_t brace_loc = c_parser_peek_token (parser)->location; > struct c_declarator *declarator; > struct c_declspecs *quals_attrs = build_null_declspecs (); > - bool static_seen; > - bool star_seen; > struct c_expr dimen; > dimen.value = NULL_TREE; > dimen.original_code = ERROR_MARK; > @@ -4724,49 +4722,48 @@ c_parser_direct_declarator_inner (c_parser *parser, > bool id_present, > c_parser_consume_token (parser); > c_parser_declspecs (parser, quals_attrs, false, false, true, > false, false, false, false, cla_prefer_id); > - static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC); > - if (static_seen) > - c_parser_consume_token (parser); > - if (static_seen && !quals_attrs->declspecs_seen_p) > - c_parser_declspecs (parser, quals_attrs, false, false, true, > - false, false, false, false, cla_prefer_id); > + > + location_t static_loc = UNKNOWN_LOCATION; > + if (c_parser_next_token_is_keyword (parser, RID_STATIC)) > + { > + static_loc = c_parser_peek_token (parser)->location; > + c_parser_consume_token (parser); > + if (!quals_attrs->declspecs_seen_p) > + c_parser_declspecs (parser, quals_attrs, false, false, true, > + false, false, false, false, cla_prefer_id); > + } > if (!quals_attrs->declspecs_seen_p) > quals_attrs = NULL; > /* If "static" is present, there must be an array dimension. > Otherwise, there may be a dimension, "*", or no > dimension. */ > - if (static_seen) > + const bool static_seen = (static_loc != UNKNOWN_LOCATION); > + bool star_seen = false; > + if (c_parser_next_token_is (parser, CPP_MULT) > + && c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE) > { > - star_seen = false; > - dimen = c_parser_expr_no_commas (parser, NULL); > + star_seen = true; > + c_parser_consume_token (parser); > } > - else > + else if (!c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) > + dimen = c_parser_expr_no_commas (parser, NULL); > + > + if (static_seen) > { > - if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) > - { > - dimen.value = NULL_TREE; > - star_seen = false; > - } > - else if (c_parser_next_token_is (parser, CPP_MULT)) > - { > - if (c_parser_peek_2nd_token (parser)->type == CPP_CLOSE_SQUARE) > - { > - dimen.value = NULL_TREE; > - star_seen = true; > - c_parser_consume_token (parser); > - } > - else > - { > - star_seen = false; > - dimen = c_parser_expr_no_commas (parser, NULL); > - } > - } > - else > + if (star_seen) > { > + error_at (static_loc, > + "%<static%> may not be used with an unspecified " > + "variable length array size"); > + /* Prevent further errors. */ > star_seen = false; > - dimen = c_parser_expr_no_commas (parser, NULL); > + dimen.value = error_mark_node; > } > + else if (!dimen.value) > + error_at (static_loc, > + "%<static%> may not be used without an array size"); > } > + > if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) > c_parser_consume_token (parser); > else > diff --git a/gcc/testsuite/gcc.dg/c99-arraydecl-4.c > b/gcc/testsuite/gcc.dg/c99-arraydecl-4.c > new file mode 100644 > index 00000000000..f8cad3b9429 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/c99-arraydecl-4.c > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-std=c99 -pedantic-errors" } */ > + > +void fo(char buf[static]); /* { dg-error "'static' may not be used without > an array size" } */ > +void fo(char buf[static]) { } /* { dg-error "'static' may not be used > without an array size" } */ > + > +void fu(char buf[static *]); /* { dg-error "'static' may not be used with an > unspecified variable length array size" > } */ > +void fu(char buf[static *]) { } /* { dg-error "'static' may not be used > with an unspecified variable length > array size" } */ > + > +void fe(int n, char buf[static n]); > +void fe(int n, char buf[static *]) { } /* { dg-error "'static' may not > be used with an unspecified variable length > array size" } */ > + > +void fa(int *n, char buf[static *n]); > +void fa(int *n, char buf[static *n]) { } > > Marek