[Piglit] [PATCH] shader_runner: Cast isspace inputs to int to silence warnings.

Vinson Lee vlee at freedesktop.org
Wed Feb 22 00:28:21 PST 2012

On Tue, Feb 21, 2012 at 7:09 AM, Brian Paul <brianp at vmware.com> wrote:
> On 02/20/2012 09:31 PM, Kenneth Graunke wrote:
>> On 02/19/2012 10:45 PM, Vinson Lee wrote:
>>> Fixes these GCC warnings on Cygwin.
>>> shader_runner.c: In function ‘strcpy_to_space’:
>>> shader_runner.c:202:2: warning: array subscript has type ‘char’
>>> shader_runner.c: In function ‘eat_whitespace’:
>>> shader_runner.c:216:2: warning: array subscript has type ‘char’
>>> shader_runner.c: In function ‘eat_text’:
>>> shader_runner.c:229:2: warning: array subscript has type ‘char’
>> These are really bizarre warnings. We're not doing array subscripting
>> here at all. We're calling isspace() on a char.
> IIRC, some std C lib implementations use an array of true/false values
> indexed by character to implement isspace(), isalpha(), etc.  Maybe that's
> what's happening here. But still, it's a weird warning.

This is the source from Cygwin.

    47  #ifndef __cplusplus
    48  /* These macros are intentionally written in a manner that will trigger
    49     a gcc -Wall warning if the user mistakenly passes a 'char' instead
    50     of an int containing an 'unsigned char'.  Note that the sizeof will
    51     always be 1, which is what we want for mapping EOF to
    52     the use of a raw index inside the sizeof triggers the gcc warning if
    53     __c was of type char, and sizeof masks side effects of the extra __c.
    54     Meanwhile, the real index to __ctype_ptr__+1 must be cast to int,
    55     since isalpha(0x100000001LL) must equal isalpha(1), rather than being
    56     an out-of-bounds reference on a 64-bit machine.  */
    57  #define __ctype_lookup(__c)
    59  #define isalpha(__c)    (__ctype_lookup(__c)&(_U|_L))
    60  #define isupper(__c)    ((__ctype_lookup(__c)&(_U|_L))==_U)
    61  #define islower(__c)    ((__ctype_lookup(__c)&(_U|_L))==_L)
    62  #define isdigit(__c)    (__ctype_lookup(__c)&_N)
    63  #define isxdigit(__c)   (__ctype_lookup(__c)&(_X|_N))
    64  #define isspace(__c)    (__ctype_lookup(__c)&_S)
    65  #define ispunct(__c)    (__ctype_lookup(__c)&_P)
    66  #define isalnum(__c)    (__ctype_lookup(__c)&(_U|_L|_N))
    67  #define isprint(__c)    (__ctype_lookup(__c)&(_P|_U|_L|_N|_B))
    68  #define isgraph(__c)    (__ctype_lookup(__c)&(_P|_U|_L|_N))
    69  #define iscntrl(__c)    (__ctype_lookup(__c)&_C)

>> This is perfectly legal, idiomatic, and common practice. Isn't the
>> whole point of isspace() and friends to tell you what class a
>> /character/ is in? Yes, they're specified with ints, but people use
>> chars all the time. They're supposed to be silently promoted.
>> IMO, if the Cygwin compiler can't handle isspace() on chars, it's
>> broken. I would just turn off the warning.
>> My vote on this patch (and the asmparsertest one) would be 'no'.
> Vinson, do you know if there's a compiler switch to silence this one?

More information about the Piglit mailing list