From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailrelay.tugraz.at (mailrelay.tugraz.at [129.27.2.202]) by sourceware.org (Postfix) with ESMTPS id 40ACB3871016 for ; Wed, 26 Jun 2024 18:02:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 40ACB3871016 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=tugraz.at Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tugraz.at ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 40ACB3871016 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=129.27.2.202 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719424931; cv=none; b=psbtjIZwhxgQvenl4C5XNzTQjldgsatiU2g7gWiAD6bPR2/81RdN8h+3eK8qozzTm6WXdXTd3C4jwKM8sGeRQ06Itc9itXEnR9WSc9WsEYi+6kcoJcgPf/P2H+2FJWjemGLxj+13q8eqD3dvdlok1fyl1L+GB96GipA2tpyD7hY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1719424931; c=relaxed/simple; bh=KiuBLqgsFJona8NPZ1Qbcg3S/i7rIVx0/iCYDw/DHpY=; h=DKIM-Signature:Message-ID:Subject:From:To:Date:MIME-Version; b=VyxttJazA0OwcCeZu40wt2oJIQHobgvk/D0o7bpFgmE9cNPsrKKxRfVXHKrylarssknCNtpVZSH6y5vrMG3QxVlVTD07AhD+RIWGCKVUm4QA5PfZkQj8AWaLiTmgKq/mPtVrhVjrXStMj8+fROWwevfzZFusdt0sUqKk5B5h6Ww= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from vra-169-240.tugraz.at (vra-169-240.tugraz.at [129.27.169.240]) by mailrelay.tugraz.at (Postfix) with ESMTPSA id 4W8Tzp2Qjhz1HNLx; Wed, 26 Jun 2024 20:01:58 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 mailrelay.tugraz.at 4W8Tzp2Qjhz1HNLx DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tugraz.at; s=mailrelay; t=1719424918; bh=uytD+YDyzR1jcyTfNJaiLWShxBuMc99DT/uOPorgdFg=; h=Subject:From:To:Cc:Date:From; b=g4aY57jbRKKp3pLnChw5XZOnyL3UqWWkLUud2cROgl26XPkFJS/q3Sr4Rn4Y05hqE sCMMTiAWP/dDKKezjighRXkY3ZTyLZG16e3mLpdfdo71yy0MtxD/+0VwNCLHx5AxNl tCx1x4+p6/h1txfWUzj+F3sb9gyKiKHYEHhOKJGY= Message-ID: <3a7d8b02c7d0687d16d6e8027dfa724601573092.camel@tugraz.at> Subject: [PATCH v2] c: Error message for incorrect use of static in array declarations From: Martin Uecker To: gcc-patches@gcc.gnu.org Cc: Joseph Myers , Marek Polacek Date: Wed, 26 Jun 2024 20:01:57 +0200 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable User-Agent: Evolution 3.46.4-2 MIME-Version: 1.0 X-TUG-Backscatter-control: G/VXY7/6zeyuAY/PU2/0qw X-Spam-Scanner: SpamAssassin 3.003001 X-Spam-Score-relay: -1.9 X-Scanned-By: MIMEDefang 2.74 on 129.27.10.117 X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Thanks Marek, here is the second version which should implement all your suggestions. =C2=A0 (BTW: Without the newline of the end, the test case has undefined behavior..., not that we need to care.) Bootstrapped and regression tested on x86_64. [PATCH] c: Error message for incorrect use of static in array declarati= ons. =20 Add an explicit error messages when c99's static is used without a size expression in an array declarator. =20 gcc/c: c-parser.cc (c_parser_direct_declarator_inner): Add error message. =20 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..db60507252b 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, b= ool id_present, location_t brace_loc =3D c_parser_peek_token (parser)->location; struct c_declarator *declarator; struct c_declspecs *quals_attrs =3D build_null_declspecs (); - bool static_seen; - bool star_seen; struct c_expr dimen; dimen.value =3D NULL_TREE; dimen.original_code =3D ERROR_MARK; @@ -4724,7 +4722,8 @@ c_parser_direct_declarator_inner (c_parser *parser, b= ool 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 =3D c_parser_next_token_is_keyword (parser, RID_STATIC); + const bool static_seen =3D 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) @@ -4735,38 +4734,34 @@ c_parser_direct_declarator_inner (c_parser *parser,= bool id_present, /* If "static" is present, there must be an array dimension. Otherwise, there may be a dimension, "*", or no dimension. */ - if (static_seen) + bool star_seen =3D false; + if (c_parser_next_token_is (parser, CPP_MULT) + && c_parser_peek_2nd_token (parser)->type =3D=3D CPP_CLOSE_SQUARE) { - star_seen =3D false; - dimen =3D c_parser_expr_no_commas (parser, NULL); + star_seen =3D true; + c_parser_consume_token (parser); } - else + else if (!c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) + dimen =3D c_parser_expr_no_commas (parser, NULL); + + if (static_seen) { - if (c_parser_next_token_is (parser, CPP_CLOSE_SQUARE)) + if (star_seen) { - dimen.value =3D NULL_TREE; + error_at (c_parser_peek_token (parser)->location, + "% may not be used with an unspecified " + "variable length array size"); + /* Prevent further errors. */ star_seen =3D false; + dimen.value =3D error_mark_node; } - else if (c_parser_next_token_is (parser, CPP_MULT)) - { - if (c_parser_peek_2nd_token (parser)->type =3D=3D CPP_CLOSE_SQUARE) - { - dimen.value =3D NULL_TREE; - star_seen =3D true; - c_parser_consume_token (parser); - } - else - { - star_seen =3D false; - dimen =3D c_parser_expr_no_commas (parser, NULL); - } - } - else + else if (!dimen.value) { - star_seen =3D false; - dimen =3D c_parser_expr_no_commas (parser, NULL); + error_at (c_parser_peek_token (parser)->location, + "% 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=3Dc99 -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 with= out 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 wi= th 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]) { }