https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106988
Bug ID: 106988 Summary: subscripting a string literal is not an integer constant expression but __builtin_strlen is Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- In C mode, GCC rejects a subscript expression whose operand is a string literal in contexts where an integer constant expression is required but accepts an equivalent expression involving __builtin_strlen. Although conforming, it's inconsistent and unnecessarily restrictive. Accepting both (either with -Wpedantic) would also be conforming and more useful to programmers who need it but don't think of using the built-in workaround. $ cat a.c && gcc -S -Wall -Wpedantic a.c #define EMPTY1(S) (__builtin_strlen(S) == 0) _Static_assert(!EMPTY1("1"), ""); // ok #define EMPTY2(S) (S[0] == 0) _Static_assert(!EMPTY2("1"), ""); // error a.c:5:16: error: expression in static assertion is not constant 5 | _Static_assert(!EMPTY2("1"), ""); // error | ^