<br><br><div class="gmail_quote">Le 4 février 2012 18:04, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com">eli.friedman@gmail.com</a>></span> a écrit :<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Sat, Feb 4, 2012 at 8:53 AM, Howard Hinnant <<a href="mailto:hhinnant@apple.com">hhinnant@apple.com</a>> wrote:<br>
> On Feb 4, 2012, at 5:25 AM, Jean-Daniel Dupas wrote:<br>
><br>
>> Hi,<br>
>><br>
>> Am I the only one having trouble compiling libc++ with clang TOT.<br>
>> For sometime now, clang refuse to compile (and use it) because of the following issue:<br>
>><br>
>> ../include/ratio:193:19: error: static_assert expression is not an integral constant expression<br>
>>     static_assert(_Xp != nan && _Yp != nan && __a_x <= max / __a_y, "overflow in __ll_mul");<br>
>>                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
>> ../include/ratio:308:13: note: in instantiation of template class 'std::__1::__ll_mul<1, 1>' requested here<br>
>>             __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value,<br>
>>             ^<br>
>> ../include/ratio:315:33: note: in instantiation of template class 'std::__1::__ratio_divide<std::__1::ratio<1, 1000000000>, std::__1::ratio<1, 1000000000> >' requested<br>
>>       here<br>
>> template <class _R1, class _R2> using ratio_divide<br>
>>                                 ^<br>
>> ../include/chrono:410:18: note: in instantiation of template type alias 'ratio_divide' requested here<br>
>>                 (ratio_divide<_Period2, period>::type::den == 1 &&<br>
>>                  ^<br>
>> ../include/chrono:406:9: note: while substituting deduced template arguments into function template 'duration' [with _Rep2 = long long, _Period2 = <no value>]<br>
>>         duration(const duration<_Rep2, _Period2>& __d,<br>
>>         ^<br>
>> ../include/ratio:193:26: note: initializer of 'nan' is not a constant expression<br>
>>     static_assert(_Xp != nan && _Yp != nan && __a_x <= max / __a_y, "overflow in __ll_mul");<br>
>>                          ^<br>
>> ../include/ratio:187:27: note: declared here<br>
>>     static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));<br>
>>                           ^<br>
>> ../include/ratio:187:27: note: declared here<br>
>> ../include/ratio:189:27: note: declared here<br>
>>     static const intmax_t max = -min;<br>
><br>
> I haven't noticed because I'm not using TOT clang, and I've been distracted by libc++abi for the past couple of months.<br>
><br>
> But I note the crux of this issue appears to be that this:<br>
><br>
>   static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1));<br>
><br>
> is no longer consider a compile time constant expression.<br>
><br>
> This is one of two things:<br>
><br>
> 1.  A clang bug.<br>
> 2.  A standards defect.  I.e. this will break a lot of C++03 code if the standard really says this.<br>
><br>
> If it is 2) it would be good for me to know immediately.  The next C++ standards meeting is next week (Feb. 6-10) and it would be good to give such a defect a high profile/priority at the meeting.<br>
><br>
> Does anyone know if this is 1) or 2)?<br>
<br>
</div></div>[expr.shift]p2: [...] if E1 has a signed type and non-negative value,<br>
and E1×2E2 is representable in the result type, then that is the<br>
resulting value; otherwise, the behavior is undefined.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Eli</font></span><br></blockquote></div><br>This should read that for signed types, E1 << E2 is equivalent to E1 * 2^(E2), footnotes and superscript just don't work as much as we would want them to :x<br><br>-- Matthieu<br>