Benedek Thaler
As far as I understand, the binary_expr gets constructed, holding the right value (3) in m_rhs. The address of this member is watched, which gets modified twice, by a lazy_ostream object, which happens to be at the same address.
This some voodoo crap is going on here. We should have some choice words with your compiler about placing two separate live objects on the same stack address. Seriously though. There are two relevant statements involved in BOOST_TEST: BOOST_TEST_BUILD_ASSERTION( P ); and report_assertion( E.evaluate(), BOOST_TEST_LAZY_MSG( "description" ), __FILE__, __LINE__, ::boost::test_tools::tt_detail::CHECK, ::boost::test_tools::tt_detail::CHECK_BUILT_ASSERTION, 0 ); You can unwrap remaining macros as well. Can you try to create trivial example illustrating the issue? you can replace report_assertion with your own function and get rid of the most of Boost.Test references (including BOOST_AUTO_TEST_CASE). Gennadiy