[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