Hi,
I recently run into an ICE by compiling phoenix3 with gcc-4.2. It seems this
particular can not handle proto::detail::poly_function_traits properly.
the problem is the default Switch template initialization ... by replacing
std::size_t Switch = sizeof(test_poly_function<Fun>(0,0)) by typename Switch
= mpl::size_t<sizeof(test_poly_function<Fun>(0,0))> the ICE is gone (the
specialisations are adapted as well.
The patch is attached.
Best regards,
Thomas
Index: boost/proto/detail/poly_function.hpp
===================================================================
--- boost/proto/detail/poly_function.hpp (revision 67425)
+++ boost/proto/detail/poly_function.hpp (working copy)
@@ -15,6 +15,7 @@
#include <boost/ref.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/void.hpp>
+ #include <boost/mpl/size_t.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/facilities/intercept.hpp>
@@ -185,7 +186,7 @@
template<typename T> unknown_function_t test_poly_function(T *, ...);
////////////////////////////////////////////////////////////////////////////////////////////////
- template<typename Fun, typename Sig, std::size_t Switch = sizeof(test_poly_function<Fun>(0,0))>
+ template<typename Fun, typename Sig, typename Switch = mpl::size_t<sizeof(test_poly_function<Fun>(0,0))> >
struct poly_function_traits
{
typedef typename Fun::template result<Sig>::type result_type;
@@ -194,7 +195,7 @@
////////////////////////////////////////////////////////////////////////////////////////////////
template<typename Fun, typename Sig>
- struct poly_function_traits<Fun, Sig, sizeof(mono_function_t)>
+ struct poly_function_traits<Fun, Sig, mpl::size_t<sizeof(mono_function_t)> >
{
typedef typename Fun::result_type result_type;
typedef Fun function_type;
@@ -265,7 +266,7 @@
////////////////////////////////////////////////////////////////////////////////////////////////
template<typename PolyFun BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A)>
- struct poly_function_traits<PolyFun, PolyFun(BOOST_PP_ENUM_PARAMS(N, A)), sizeof(poly_function_t)>
+ struct poly_function_traits<PolyFun, PolyFun(BOOST_PP_ENUM_PARAMS(N, A)), mpl::size_t<sizeof(poly_function_t)> >
{
typedef typename PolyFun::template impl<BOOST_PP_ENUM_PARAMS(N, const A)> function_type;
typedef typename function_type::result_type result_type;
_______________________________________________
proto mailing list
[email protected]
http://lists.boost.org/mailman/listinfo.cgi/proto