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
      |                 ~~~~^~~~

Reply via email to