https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95177
--- Comment #15 from Roland Illig <roland.illig at gmx dot de> ---
(In reply to Steve Kargl from comment #9)
> I'm still trying to understand how an
> option names -Werror=char-subscripts could trigger an
> error. There are no subscripts.
There _are_ subscripts, just look at the precompiled C translation unit.
$ printf '%s\n' '#include <ctype.h>' 'isspace(ch)' | gcc -E -
On Cygwin, the output ends with:
((((__locale_ctype_ptr ()) + sizeof(""[ch]))[(int)(ch)])&010)
The expression `sizeof(""[ch])` has two purposes. The first is to add 1 to the
array index (since EOF is -1 in that implementation), the second is to trigger
the GCC diagnostic, to prevent the undefined behavior. That's why all C
programmers who know the <ctype.h> functions cast the argument from `char` to
`unsigned char`, to be absolutely sure that there is no undefined behavior, no
matter what value the argument has.
On NetBSD, the pattern is similar:
((int)((_ctype_tab_ + 1)[(ch)] & 0x0040))
Here, the argument is directly used as an array subscript, without casting it
first, with the same effect of triggering the GCC diagnostic.