[cfe-dev] Error when testing clang with VC++ RTL and Boost MPL

Edward Diener eldlistmailingz at tropicsoft.com
Wed Nov 13 11:47:42 PST 2013


On 11/13/2013 9:46 AM, Edward Diener wrote:
> I am seeing this error when testing Boost MPL with clang using the VC++
> RTL:
>
> "bitwise.cpp(40,25) :  error: non-type template argument evaluates to
> 4294967295, which cannot be narrowed to type 'long' [-Wc++11-narrowing]
> MPL_ASSERT_RELATION( (bitor_<_0,_ffffffff>::value), ==, 0xffffffff );"
>
> The typedefs are:
>
> typedef integral_c<unsigned int, 0> _0;
> typedef integral_c<unsigned int, 0xffffffff> _ffffffff;
>
> The bitor_ in the Boost MPL is evaluating constants at compile time,
> doing a bitwise or ('|').
>
> Why does clang think that 0xffffffff is a 'long' when used in the
> comparison ? According to the C++ standard the type of 0xffffffff is the
> first of int, unsigned int, long, unsigned long, long long, unsigned
> long long in which its value can fit ( section 2.14.2 ). Is this a clang
> bug ?

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.




More information about the cfe-dev mailing list