[cfe-commits] libc++ and const expr.

Howard Hinnant hhinnant at apple.com
Sat Feb 4 11:46:05 PST 2012


On Feb 4, 2012, at 2:27 PM, Joerg Sonnenberger wrote:

> On Sat, Feb 04, 2012 at 11:53:28AM -0500, Howard Hinnant wrote:
>> But I note the crux of this issue appears to be that this:
>> 
>>   static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));
>> 
>> is no longer consider a compile time constant expression.
> 
> Ignoring the question of whether clang should allow that or not, why
> aren't you using the more compact statement below, which is just as
> portable:
> 
> static const intmax_t -~(intmax_t)0;


That gives the value 1.  These expressions are forming the value 0x8000000000000000.

That being said, I have no doubt that this can be fixed in libc++.  It won't be easy, because this issue occurs in many more places than just <ratio>.  And I actually haven't decided how I would fix it.  But I'm sure it can be done.

The real issue is that I believe this code to be sufficient common as to irritate a sufficient number of customers.  And this despite the fact that the code is well-defined on all hardware clang will ever target.  On modern platforms there is only a left shift, not a signed left shift and unsigned left shift.  Or if there is a distinction, the two are synonyms.

Howard




More information about the cfe-commits mailing list