<div dir="ltr">On Wed, Nov 13, 2013 at 11:47 AM, Edward Diener <span dir="ltr"><<a href="mailto:eldlistmailingz@tropicsoft.com" target="_blank">eldlistmailingz@tropicsoft.com</a>></span> wrote:<br><div class="gmail_extra">
<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">On 11/13/2013 9:46 AM, Edward Diener wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I am seeing this error when testing Boost MPL with clang using the VC++<br>
RTL:<br>
<br>
"bitwise.cpp(40,25) :  error: non-type template argument evaluates to<br>
4294967295, which cannot be narrowed to type 'long' [-Wc++11-narrowing]<br>
MPL_ASSERT_RELATION( (bitor_<_0,_ffffffff>::value), ==, 0xffffffff );"<br>
<br>
The typedefs are:<br>
<br>
typedef integral_c<unsigned int, 0> _0;<br>
typedef integral_c<unsigned int, 0xffffffff> _ffffffff;<br>
<br>
The bitor_ in the Boost MPL is evaluating constants at compile time,<br>
doing a bitwise or ('|').<br>
<br>
Why does clang think that 0xffffffff is a 'long' when used in the<br>
comparison ? According to the C++ standard the type of 0xffffffff is the<br>
first of int, unsigned int, long, unsigned long, long long, unsigned<br>
long long in which its value can fit ( section 2.14.2 ). Is this a clang<br>
bug ?<br>
</blockquote>
<br></div>
Sorry, the problem is not as I had assumed above. It is actually because the MPL_ASSERT_RELATION macro devolves down to a template class where the values are of type 'long'. Is there something in C++11 which says that implicit conversion of a value from an 'unsigned int' to a 'long' is illegal ? That is what clang is telling me but I can find no such restriction in the C++11 standard regarding this.</blockquote>
<div><br></div><div>There's something like this, yes. When you have a template-parameter of some integral type T, a template-argument for that parameter must be a converted constant expression of type T. Converted constant expressions don't allow narrowing conversions in the final implicit conversion from their value to type T. And the conversion from 4294967295 to type 'long' is a narrowing conversion, because that value does not fit in the type 'long'. So the program is ill-formed.</div>
</div></div></div>