Boost logo

Boost Users :

From: John Maddock (john_at_[hidden])
Date: 2008-03-19 05:35:09


Erik wrote:
> John Maddock skrev:
>> Jean-Francois Bastien wrote:
>>>> We have this really neat and simple macro in our project:
>>>> #define compile_assert(x) typedef bool
>>>> COMPILE_ASSERT[(x) ? 1 : -1]
>>>>
>>>> Although it does what we need and serves us well, I
>>>> tried to replace
>>>> it with BOOST_STATIC_ASSERT. Unfortunately this resulted
>>>> in a lot of
>>>> ugly warnings throughout the compile:
>>>> warning: use of old-style cast
>>>>
>>>
>>> There's the following comment in the static assert header:
>>>
>>> // Note that the argument to the assert is explicitly cast to bool
>>> using old-
>>> // style casts: too many compilers currently have problems with
>>> static_cast
>>> // when used inside integral constant expressions.
>>>
>>> The solution would be to add even more defines to use old style or
>>> static casts depending on which compiler is used.
>>
>> Right: historically this is why the header doesn't use static_cast
>> here.
>>
>> Unfortunately GCC appears to be one of the compilers that chokes if
>> you use static_cast in an integral constant expression: testing the
>> diff below with gcc-3.4 (cygwin) results in the tests failing (where
>> as enabling the same static_cast useage with msvc or intel does work
>> OK).
>>
>> If you anyone can test this with gcc-4.x and let me know which
>> versions might accept this patch OK that would be very useful, I'm
>> attaching the updated static_assert.hpp as well as the diff.
>
> Here is my test.
> 1. Execute "mkdir static_assert; cd static_assert".
> 2. Save your attached file static_assert.hpp there.
> 3. Create the test file prov.cc there.
>
> The rest of the test results follow as console output (where
> "static_assert $ " is the prompt):
> static_assert $ cat --number prov.cc
> 1 #include "static_assert.hpp"
> 2 BOOST_STATIC_ASSERT(1 < 2);
> 3 BOOST_STATIC_ASSERT(1 > 2);
> static_assert $ LANG="" g++-4.1.2 -Wall -Wextra -Wold-style-cast -c
> prov.cc prov.cc:3: error: parse error in template argument list
> prov.cc:3: error: template argument 1 is invalid
> prov.cc:3: error: expected unqualified-id at end of input
> static_assert $ LANG="" g++-4.2.3 -Wall -Wextra -Wold-style-cast -c
> prov.cc prov.cc:3: error: parse error in template argument list
> prov.cc:3: error: template argument 1 is invalid
>
>
> As you can see, it fails at line 3 as it should, while not complaining
> about line 2. It will not complain about any old-style-cast either. So
> the test was completely successful.

Hardly that successful: those error messages are awful! The whole point of
BOOST_STATIC_ASSERT is to provide semi-readable error messages - at least so
that you know it's a static assertion failure and not some other issue
that's the problem.

I'll have another look at this when I have a chance.

John.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net