Boost logo

Boost Users :

From: Erik (esigra_at_[hidden])
Date: 2008-03-18 18:28:00


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.


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