[cfe-dev] Error when testing clang with VC++ RTL and Boost MPL
Edward Diener
eldlistmailingz at tropicsoft.com
Wed Nov 13 15:03:21 PST 2013
On 11/13/2013 5:08 PM, David Blaikie wrote:
>
>
>
> On Wed, Nov 13, 2013 at 1:58 PM, Edward Diener
> <eldlistmailingz at tropicsoft.com
> <mailto:eldlistmailingz at tropicsoft.com>> wrote:
>
> On 11/13/2013 2:59 PM, Jordan Rose wrote:
>
>
> On Nov 13, 2013, at 11:47 , Edward Diener
> <eldlistmailingz at tropicsoft.__com
> <mailto:eldlistmailingz at tropicsoft.com>
> <mailto:eldlistmailingz at __tropicsoft.com
> <mailto:eldlistmailingz at tropicsoft.com>>>
> wrote:
>
> 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.
>
>
> I think it’s more likely that on Windows ‘long’ is the same size as
> ‘int’, and so you have an overflow error. You need to fix the
> template…which I guess means submitting a patch to Boost.
>
>
> I tried a patch of the test code where I set:
>
> typedef integral_c<int, 0xffffffff> _ffffffff;
>
> but clang still complains that:
>
> bitwise.cpp(23,24) : error: non-type template argument evaluates to
> 4294967295, which cannot be narrowed to type 'int' [-Wc++11-narrowing]
> typedef integral_c<int, 0xffffffff> _ffffffff;
>
> This I do not understand. Why does 0xffffffff evaluate to 4294967295
> rather than -1 ? Where in the C++ standard does it say that hex
> literals are unsigned values by default ?
>
>
> Nothing to do with hex literals, just literals in general. If they don't
> fit in the range of an int, the literal is of unsigned int type so it
> can fit the value.
Is not -1 in the range of an 'int' ? Is not 0xffffffff equivalent to -1
as a signed value ? What am I missing here ?
More information about the cfe-dev
mailing list