The following code works here: // ----------------------------------------------------------------------- #include<boost/proto/proto.hpp> using namespace boost; typedef proto::terminal<int>::type terminal; struct addition: proto::or_ < proto::terminal<proto::_>, proto::plus<addition, addition> > {}; struct equation: proto::or_ < addition, proto::equal_to<addition, addition> > {}; template<class Expr> struct extension; struct my_domain: proto::domain < proto::pod_generator< extension>, equation > {}; template<class Expr> struct extension { BOOST_PROTO_EXTENDS( Expr , extension<Expr> , my_domain ) }; int main() { extension<terminal> i; i == i; } Seems proto::or_ wiht *1* condition acts weird. Eric, am I right or am I hallucinating and missing the obvious ?