
On Thu, Jun 19, 2008 at 6:35 AM, Daniel James
2008/6/18 Chris Fairles
: I'm wrong. It's correctly erroring because: #elif 0 && () == 1 isn't a valid constant expression.
If BOOST_PP_ITERATION_DEPTH was not defined that would probably be:
#elif 0 && BOOST_PP_ITERATION_DEPTH() == N
Which I think still isn't valid.
The basic structure of boost/mpl/aux_/advance_backward.hpp is something like:
#if !defined(BOOST_PP_IS_ITERATING) // ... #elif BOOST_PP_ITERATION_DEPTH() == 1 // ... #elif BOOST_PP_ITERATION_DEPTH() == 2 // ... #endif
If I understand you correctly, gcc 4.4 has started evaluating the '#elif' arguments even when a previous '#if' or '#elif' argument was true. I have no idea if gcc 4.4 is correct....
Your patch changes this to:
#if !defined(BOOST_PP_IS_ITERATING) // ... #elif defined(BOOST_PP_ITERATION_DEPTH) # if BOOST_PP_ITERATION_DEPTH() == 1 // ... # endif #elif defined(BOOST_PP_ITERATION_DEPTH) # if BOOST_PP_ITERATION_DEPTH() == 2 // ... # endif #endif
Which is wrong because the check 'BOOST_PP_ITERATION_DEPTH() == 2' can never be reached. A solution might be something like:
#if !defined(BOOST_PP_IS_ITERATING) // ... #else # if BOOST_PP_ITERATION_DEPTH() == 1 // ... # elif BOOST_PP_ITERATION_DEPTH() == 2 // ... # endif #endif
Anyway, I doubt the relevant developers will see this. The best way to get their attention would probably be to create a ticket:
http://svn.boost.org/trac/boost/newticket?component=mpl
Daniel _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
Ha. Classic case of "It compiles? Ship it!" Good catch, your solution is indeed what I intended. Will fix and submit ticket. Cheers, Chris