[Bug c/106988] subscripting a string literal is not an integer constant expression but __builtin_strlen is
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Sep 22 16:12:19 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106988
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|DUPLICATE |---
Status|RESOLVED |UNCONFIRMED
Keywords|diagnostic |rejects-valid
--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
After experimenting with this some more I think the decision to reject this and
the other similar requests should be reconsidered. GCC accepts many equivalent
nonconstant expressions in contexts where they are required (see below).
Rejecting the simplest of them seems arbitrary and is (as is evident from the
duplicate requests) unhelpful to C programmers and surprising those used to the
C++ behavior.
$ cat a.c && gcc -S -Wall -Wpedantic a.c
#include <string.h>
_Static_assert (memcmp ("", "", 1) == 0, ""); // okay in C mode only
_Static_assert (memchr ("", 0, 1) != 0, ""); // okay in C mode only
_Static_assert (strlen ("") == 0, ""); // okay in C and C++
_Static_assert (strcmp ("", "") == 0, ""); // okay in C and C++
_Static_assert ("" == "", ""); // okay in C and C++
_Static_assert (*"" == 0, ""); // error in C only
a.c:3:36: warning: expression in static assertion is not an integer constant
expression [-Wpedantic]
3 | _Static_assert (memcmp ("", "", 1) == 0, ""); // okay in C mode only
| ~~~~~~~~~~~~~~~~~~~^~~~
a.c:4:35: warning: expression in static assertion is not an integer constant
expression [-Wpedantic]
4 | _Static_assert (memchr ("", 0, 1) != 0, ""); // okay in C mode only
| ~~~~~~~~~~~~~~~~~~^~~~
a.c:5:29: warning: expression in static assertion is not an integer constant
expression [-Wpedantic]
5 | _Static_assert (strlen ("") == 0, ""); // okay in C and C++
| ~~~~~~~~~~~~^~~~
a.c:6:33: warning: expression in static assertion is not an integer constant
expression [-Wpedantic]
6 | _Static_assert (strcmp ("", "") == 0, ""); // okay in C and C++
| ~~~~~~~~~~~~~~~~^~~~
a.c:7:20: warning: comparison with string literal results in unspecified
behavior [-Waddress]
7 | _Static_assert ("" == "", ""); // okay in C and C++
| ^~
a.c:7:20: warning: expression in static assertion is not an integer constant
expression [-Wpedantic]
7 | _Static_assert ("" == "", ""); // okay in C and C++
| ~~~^~~~~
a.c:9:21: error: expression in static assertion is not constant
9 | _Static_assert (*"" == 0, ""); // error in C only
| ~~~~^~~~
More information about the Gcc-bugs
mailing list