public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH v3] c: Error message for incorrect use of static in array declarations
@ 2024-06-27 11:06 Uecker, Martin
  2024-06-27 15:32 ` Marek Polacek
  0 siblings, 1 reply; 2+ messages in thread
From: Uecker, Martin @ 2024-06-27 11:06 UTC (permalink / raw)
  To: gcc-patches; +Cc: josmyers, polacek


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]) { }



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH v3] c: Error message for incorrect use of static in array declarations
  2024-06-27 11:06 [PATCH v3] c: Error message for incorrect use of static in array declarations Uecker, Martin
@ 2024-06-27 15:32 ` Marek Polacek
  0 siblings, 0 replies; 2+ messages in thread
From: Marek Polacek @ 2024-06-27 15:32 UTC (permalink / raw)
  To: Uecker, Martin; +Cc: gcc-patches, josmyers

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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-06-27 15:33 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-27 11:06 [PATCH v3] c: Error message for incorrect use of static in array declarations Uecker, Martin
2024-06-27 15:32 ` Marek Polacek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).