diff options
author | Martin Uecker <uecker@tugraz.at> | 2024-06-27 21:47:56 +0200 |
---|---|---|
committer | Martin Uecker <uecker@gcc.gnu.org> | 2024-06-27 21:55:24 +0200 |
commit | da7976a015a4388b8ed843412c3c1c840451cf0f (patch) | |
tree | 6e4d16d3a5e89285aa74131a90305c4c469dd6ce /gcc/c | |
parent | 1dc143181550573c9c902fb7a3b495e9b409d0b0 (diff) | |
download | gcc-da7976a015a4388b8ed843412c3c1c840451cf0f.zip gcc-da7976a015a4388b8ed843412c3c1c840451cf0f.tar.gz gcc-da7976a015a4388b8ed843412c3c1c840451cf0f.tar.bz2 |
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.
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/c-parser.cc | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 6a3f96d..8c4e697 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 |