Boost logo

Proto :

Subject: Re: [proto] Adding stuff in proto operator
From: Joel Falcou (joel.falcou_at_[hidden])
Date: 2010-12-29 05:40:27

Error found.

The problem was in the and_impl transform. It uses comma operator to
chain calls to each and_ alternatives.
However, when this is used in a grammar used as a Generator, it enters a
subtle infinite loop as each comma
want to build an expression with the newly generated expression.

I locally modified proto this way in boost/proto/matches.hpp :

template<BOOST_PP_ENUM_PARAMS(N, typename G), typename Expr, typename
State, typename Data>
struct _and_impl<proto::and_<BOOST_PP_ENUM_PARAMS(N, G)>, Expr, State, Data>
      : proto::transform_impl<Expr, State, Data>
   #define M0(Z, N,
       typename proto::when<proto::_, BOOST_PP_CAT(G,
N)> \
           ::template impl<Expr, State,
Data> \
N); \

   typedef typename BOOST_PP_CAT(Gimpl, BOOST_PP_DEC(N))::result_type

   result_type operator()(
       typename _and_impl::expr_param e
     , typename _and_impl::state_param s
     , typename _and_impl::data_param d
   ) const
    // Fix: jfalcou - 12/29/2010
    // This allow and_ to be used in grammar used as generator
    // by not using comma which caused an infinite loop

   #define M1(Z,N,DATA) \

     // expands to G0()(e,s,d); G1()(e,s,d); ... G{N-1}()(e,s,d);
     return BOOST_PP_CAT(Gimpl,BOOST_PP_DEC(N))()(e,s,d);

   #undef M1
   #undef M0

instead of using comma, I just generate N-1 application of GimplN and
return the last Gimpl call.

Is this fix acceptable or am I doing something wrong all together ?
If yes, Eric, any objections that I merge this into trunk ?

Proto list run by eric at