https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106988
Martin Sebor changed:
What|Removed |Added
Resolution|DUPLICATE |---
Status|RESOLVED|UNCONFIRMED
Keywords|diagnostic |rejects-valid
--- Comment #2 from Martin Sebor ---
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
_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
| ^~~~