Next version with the improved location. I assume the [PATCH] should become part of the commit message.
Bootstrapped and regression tested on x86_64. 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]) { }