|
Boost : |
From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2006-11-10 19:02:15
Phil Richards writes:
> On 2006-10-24, Douglas Gregor <dgregor_at_[hidden]> wrote:
> > Boost Regression test failures
> > Report time: 2006-10-24T10:41:49Z
> [...]
> > |mpl|
> > multiset: gcc-4.0.3_linux gcc-4.1.0_linux gcc-4.1.0_linux_x86_64 gcc-4.1.1_sunos_i86pc gcc-4_0_3_tru64
>
> These are not going to go away unless either:
> 1. they are marked as expected
> 2. the test is reworked to avoid the problem
> 3. the macro BOOST_MPL_ASSERT_RELATION is reworked to avoid the problem
>
> See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29518
Thanks for the lead!
>
> The macro is:
> #define BOOST_MPL_ASSERT(pred) \
> enum { \
> BOOST_PP_CAT(mpl_assertion_in_line_,__LINE__) = sizeof( \
> boost::mpl::assertion_failed<false>( \
> boost::mpl::assert_arg( (void (*) pred)0, 1 ) \
> ) \
> ) \
> }\
> /**/
>
> It is apparently to do with the enum usage...
Actually, no, enums in the bug's subject and reduced test case are a
red herring. For example, this still fails for me on 4.1.1:
template< int C > int assertion_failed(int);
template< class > struct N
{
static int const value = 1;
static int const t = sizeof( assertion_failed<value>(0) );
};
int main()
{
N<int> n;
return n.t;
}
As a matter of fact, my current workaround for this issue involves
_introducing_ an auxiliary enum for the values that are used in
function templates' non-type arguments, e.g.:
template< int C > int assertion_failed(int);
template< class > struct N
{
static int const value = 1;
enum { gcc_workaround = value };
static int const t = sizeof( assertion_failed<gcc_workaround>(0) ); // it compiles, yay!
};
> I'm guessing there is a good reason why this code (and others in the
> boost/mpl/assert.hpp) uses enum directly rather than
> BOOST_STATIC_CONSTANT?
I vaguely recalled that there was, but didn't remeber what it was, so
in the end I found it out the hard way :). There are at least two
reasons:
1) Borland can't cope with static constants there
(http://article.gmane.org/gmane.comp.lib.boost.testing/3514).
2) GCC issues "unused variable" warnings when static constants are
used at a function scope
(http://article.gmane.org/gmane.comp.lib.boost.devel/150691).
Thanks for your input,
-- Aleksey Gurtovoy MetaCommunications Engineering
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk