Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r81027 - in trunk: boost/mpl libs/mpl/test
From: steven_at_[hidden]
Date: 2012-10-20 12:43:52


Author: steven_watanabe
Date: 2012-10-20 12:43:51 EDT (Sat, 20 Oct 2012)
New Revision: 81027
URL: http://svn.boost.org/trac/boost/changeset/81027

Log:
Work around VC11 bug when evaluating nested BOOST_MPL_ASSERTs.
Text files modified:
   trunk/boost/mpl/assert.hpp | 70 +++++++++++++++++++++++++++++++++++++++
   trunk/libs/mpl/test/assert.cpp | 11 ++++++
   2 files changed, 80 insertions(+), 1 deletions(-)

Modified: trunk/boost/mpl/assert.hpp
==============================================================================
--- trunk/boost/mpl/assert.hpp (original)
+++ trunk/boost/mpl/assert.hpp 2012-10-20 12:43:51 EDT (Sat, 20 Oct 2012)
@@ -34,6 +34,9 @@
 #include <boost/config.hpp> // make sure 'size_t' is placed into 'std'
 #include <cstddef>
 
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
+#include <boost/mpl/if.hpp>
+#endif
 
 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
     || (BOOST_MPL_CFG_GCC != 0) \
@@ -131,8 +134,38 @@
 
 #endif
 
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1700)
+
+template<class Pred>
+struct extract_assert_pred;
+
+template<class Pred>
+struct extract_assert_pred<void(Pred)> { typedef Pred type; };
+
+template<class Pred>
+struct eval_assert {
+ typedef typename extract_assert_pred<Pred>::type P;
+ typedef typename P::type p_type;
+ typedef typename ::boost::mpl::if_c<p_type::value,
+ AUX778076_ASSERT_ARG(assert<false>),
+ failed ************ P::************
+ >::type type;
+};
+
+template<class Pred>
+struct eval_assert_not {
+ typedef typename extract_assert_pred<Pred>::type P;
+ typedef typename P::type p_type;
+ typedef typename ::boost::mpl::if_c<!p_type::value,
+ AUX778076_ASSERT_ARG(assert<false>),
+ failed ************ ::boost::mpl::not_<P>::************
+ >::type type;
+};
+
+template< typename T >
+T make_assert_arg();
 
-#if !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
+#elif !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
 
 template< bool > struct assert_arg_pred_impl { typedef int type; };
 template<> struct assert_arg_pred_impl<true> { typedef void* type; };
@@ -211,6 +244,39 @@
 
 BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
 
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
+
+// BOOST_MPL_ASSERT((pred<x,...>))
+
+#define BOOST_MPL_ASSERT(pred) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+ std::size_t \
+ , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+ boost::mpl::assertion_failed<false>( \
+ boost::mpl::make_assert_arg< \
+ typename boost::mpl::eval_assert<void pred>::type \
+ >() \
+ ) \
+ ) \
+ ) \
+/**/
+
+// BOOST_MPL_ASSERT_NOT((pred<x,...>))
+
+#define BOOST_MPL_ASSERT_NOT(pred) \
+BOOST_MPL_AUX_ASSERT_CONSTANT( \
+ std::size_t \
+ , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
+ boost::mpl::assertion_failed<false>( \
+ boost::mpl::make_assert_arg< \
+ typename boost::mpl::eval_assert_not<void pred>::type \
+ >() \
+ ) \
+ ) \
+ ) \
+/**/
+
+#else
 
 // BOOST_MPL_ASSERT((pred<x,...>))
 
@@ -250,6 +316,8 @@
 /**/
 #endif
 
+#endif
+
 // BOOST_MPL_ASSERT_RELATION(x, ==|!=|<=|<|>=|>, y)
 
 #if defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)

Modified: trunk/libs/mpl/test/assert.cpp
==============================================================================
--- trunk/libs/mpl/test/assert.cpp (original)
+++ trunk/libs/mpl/test/assert.cpp 2012-10-20 12:43:51 EDT (Sat, 20 Oct 2012)
@@ -71,6 +71,17 @@
     }
 };
 
+template<class T>
+struct nested : boost::mpl::true_ {
+ BOOST_MPL_ASSERT(( boost::is_pointer<T*> ));
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<void,T> ));
+ BOOST_MPL_ASSERT_RELATION( sizeof(T*), >, 1 );
+ BOOST_MPL_ASSERT_MSG( true, GLOBAL_SCOPE_ERROR, (int,long) );
+};
+
+BOOST_MPL_ASSERT(( nested<int> ));
+BOOST_MPL_ASSERT_NOT(( boost::mpl::not_<nested<unsigned> > ));
+
 int main()
 {
     her<void> h;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk