Index: libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp =================================================================== --- libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp (revision 49708) +++ libs/spirit/phoenix/test/bind/bind_member_variable_tests.cpp (working copy) @@ -29,21 +29,75 @@ }; } -int -main() +template +void write_test(F f) { + T x_; + bind(&T::m, f(x_))() = 122; + BOOST_TEST(x_.m == 122); + bind(&T::m, arg1)(f(x_)) = 123; + BOOST_TEST(x_.m == 123); +} + +template +void read_test(F f) { + T x_; + x_.m = 123; + + BOOST_TEST(bind(&T::m, f(x_))() == 123); + BOOST_TEST(bind(&T::m, arg1)(f(x_)) == 123); +} + +struct identity { + template + T& operator()(T& t) const { - test::x x_; - bind(&test::x::m, x_)() = 123; - bind(&test::x::m, arg1)(x_) = 123; - BOOST_TEST(x_.m == 123); + return t; } +}; + +struct constify +{ + template + const T& operator()(const T& t) const { - test::xx x_= {0}; - bind(&test::xx::m, val(x_))(); // does not compile - bind(&test::xx::m, ref(x_))() = 1; - bind(&test::xx::m, cref(x_))(); + return t; } +}; +struct add_pointer +{ + template + T* const operator()(T& t) const + { + return &t; + } +}; + +struct add_const_pointer +{ + template + const T* const operator()(const T& t) const + { + return &t; + } +}; + +int +main() +{ + write_test(identity()); + write_test(add_pointer()); + write_test(identity()); + write_test(add_pointer()); + + read_test(identity()); + //read_test(constify()); // this fails because of capture by value. + read_test(add_pointer()); + read_test(add_const_pointer()); + read_test(identity()); + read_test(constify()); + read_test(add_pointer()); + read_test(add_const_pointer()); return boost::report_errors(); }