Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150417183511.GJ2875@port70.net>
Date: Fri, 17 Apr 2015 20:35:12 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: Explicit casts in ctype.h suppress compiler warnings

* Alexander Monakov <amonakov@...ras.ru> [2015-04-17 21:24:09 +0300]:
> 
> I confirm that the idea works, and as Rich said it causes a warning with
> -pedantic -std=c89 with gcc-4.5..4.7 (but not 4.8, 4.9).
> 

i assume we could use compound literals in c89 with __extension__

> > Do you have an idea in mind for how we could achieve that? I suspect
> > the macros are still better optimizable than the inline function
> > approach, so I'd lean towards doing a macro that avoids evaluating c
> > and just checks its type, which would involve using ?: I think.
> 
> I admit I was thinking of doing isspace-style inlines everywhere, but thanks
> to your suggestion I was able to come up with this:
> 
> static __inline void __is_int(int a) {}
> #define isdigit(a) (__is_int(0?(a):0), ((unsigned)(a)-'0') < 10)
> 

i think using :0 there is not useful because null
pointer constants are special in ?:

i think rich meant something like

#define isdigit(a) (((0?1U:(a))-'0') < 10)

which works when the conversion rank of a is <= unsigned

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.