Ticket #5475: fix_gcc_4_4_regression_by_C.patch

File fix_gcc_4_4_regression_by_C.patch, 3.5 KB (added by Michel Morin <mimomorin@…>, 11 years ago)

A patch for fixing gcc-4.4 regression (against trunk). This patch implements C of comment 23.

  • boost/foreach.hpp

     
    10521052
    10531053namespace boost { namespace foreach_detail_
    10541054{
     1055    template<typename Cond, typename T>
     1056    inline typename boost::mpl::if_<Cond, T const, T>::type &add_const_if(T &t)
     1057    {
     1058        return t;
     1059    }
     1060   
    10551061    template<typename T>
    10561062    typename remove_cv<typename decay<T>::type>::type decay_copy(T &&);
    10571063   
    10581064    template<typename T>
    10591065    T const add_const_if_rvalue(T &&);
    10601066}}
    1061 # define BOOST_FOREACH_AUTO_OBJECT(NAME, EXPR)                                                                    \
     1067
     1068#  define BOOST_FOREACH_IS_RVALUE(COL)                                                                           \
     1069    (true ? 0 : boost::foreach_detail_::is_rvalue(COL))
     1070
     1071# if (BOOST_WORKAROUND(__GNUC__, == 4) && (__GNUC_MINOR__ == 4) && !defined(BOOST_INTEL) && !defined(BOOST_CLANG))
     1072#  define BOOST_FOREACH_AUTO_OBJECT(NAME, EXPR)                                                                   \
    10621073    if (bool BOOST_PP_CAT(NAME, _defined) = false) {} else                                                        \
     1074    for (auto NAME = (EXPR); !BOOST_PP_CAT(NAME, _defined); BOOST_PP_CAT(NAME, _defined) = true)
     1075# else
     1076#  define BOOST_FOREACH_AUTO_OBJECT(NAME, EXPR)                                                                   \
     1077    if (bool BOOST_PP_CAT(NAME, _defined) = false) {} else                                                        \
    10631078    for (decltype(boost::foreach_detail_::decay_copy(EXPR)) NAME = (EXPR);                                        \
    10641079        !BOOST_PP_CAT(NAME, _defined); BOOST_PP_CAT(NAME, _defined) = true)
     1080# endif
    10651081
    10661082// If EXPR is an rvalue, bind it to a const rvalue reference.
    1067 # define BOOST_FOREACH_AUTO_REF_REF(NAME, EXPR)                                                                   \
     1083# if (BOOST_WORKAROUND(__GNUC__, == 4) && (__GNUC_MINOR__ == 4) && !defined(BOOST_INTEL) && !defined(BOOST_CLANG))
     1084#  define BOOST_FOREACH_AUTO_REF_REF(NAME, EXPR)                                                                  \
     1085    if (bool BOOST_PP_CAT(NAME, _tmp_defined) = false) {} else                                                    \
     1086    for (auto &&BOOST_PP_CAT(NAME, _tmp) = (EXPR);                                                                \
     1087        !BOOST_PP_CAT(NAME, _tmp_defined); BOOST_PP_CAT(NAME, _tmp_defined) = true)                               \
    10681088    if (bool BOOST_PP_CAT(NAME, _defined) = false) {} else                                                        \
     1089    for (auto &&NAME = boost::foreach_detail_::add_const_if< boost::is_rvalue_reference<decltype( (EXPR) ) &&> >( \
     1090            BOOST_PP_CAT(NAME, _tmp));                                                                            \
     1091        !BOOST_PP_CAT(NAME, _defined); BOOST_PP_CAT(NAME, _defined) = true)
     1092# else
     1093#  define BOOST_FOREACH_AUTO_REF_REF(NAME, EXPR)                                                                  \
     1094    if (bool BOOST_PP_CAT(NAME, _defined) = false) {} else                                                        \
    10691095    for (decltype(boost::foreach_detail_::add_const_if_rvalue(EXPR)) &&NAME = (EXPR);                             \
    10701096        !BOOST_PP_CAT(NAME, _defined); BOOST_PP_CAT(NAME, _defined) = true)
     1097# endif
    10711098
    10721099#elif defined(BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTION)
    10731100///////////////////////////////////////////////////////////////////////////////