1 ///////////////////////////////////////////////////////////////////////////////
2 // bug2407.hpp
3 //
4 // Copyright 2008 Eric Niebler. Distributed under the Boost
5 // Software License, Version 1.0. (See accompanying file
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
8 #include <iostream>
9 #include <boost/proto/proto.hpp>
10
11 namespace mpl = boost::mpl;
12 namespace proto = boost::proto;
13 using proto::_;
14
15 template<class E>
16 struct e;
17
18 struct g
19 : proto::or_<
20 proto::terminal<int>
21 , proto::plus<g,g>
22 >
23 {};
24
25 struct d
26 : proto::domain<proto::generator<e>, g>
27 {};
28
29 template<class E>
30 struct e
31 : proto::extends<E, e<E>, d>
32 {
33 BOOST_MPL_ASSERT((proto::matches<E, g>));
34
ee35 e(E const &x = E())
36 : proto::extends<E, e<E>, d>(x)
37 {}
38 };
39
40 e<proto::terminal<int>::type> i;
41
42 template<class E>
operator <<(std::ostream & sout,e<E> const & x)43 std::ostream &operator<<(std::ostream &sout, e<E> const &x)
44 {
45 return sout;
46 }
47
main()48 int main()
49 {
50 std::cout << (i+i);
51 }
52