aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorMartin Uecker <uecker@tugraz.at>2024-06-27 21:47:56 +0200
committerMartin Uecker <uecker@gcc.gnu.org>2024-06-27 21:55:24 +0200
commitda7976a015a4388b8ed843412c3c1c840451cf0f (patch)
tree6e4d16d3a5e89285aa74131a90305c4c469dd6ce /gcc/c
parent1dc143181550573c9c902fb7a3b495e9b409d0b0 (diff)
downloadgcc-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.cc63
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