[Bug c/106988] subscripting a string literal is not an integer constant expression but __builtin_strlen is

2022-09-22 Thread msebor at gcc dot gnu.org via Gcc-bugs
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
  | ^~~~

[Bug c/106988] subscripting a string literal is not an integer constant expression but __builtin_strlen is

2022-09-20 Thread pinskia at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106988

Andrew Pinski  changed:

   What|Removed |Added

 Status|UNCONFIRMED |RESOLVED
 Resolution|--- |DUPLICATE
   See Also||https://gcc.gnu.org/bugzill
   ||a/show_bug.cgi?id=44094

--- Comment #1 from Andrew Pinski  ---
This is an exact dup of bug 89408 and basically the same as PR 44094.

*** This bug has been marked as a duplicate of bug 89408 ***