Opened 10 years ago
Closed 6 years ago
#7391 closed Bugs (fixed)
phoenix::insert compile fails with libc++
Reported by: | Naomasa Matsubayashi | Owned by: | Thomas Heller |
---|---|---|---|
Milestone: | To Be Determined | Component: | phoenix |
Version: | Boost Development Trunk | Severity: | Problem |
Keywords: | Cc: |
Description
Following code produces a compile error with libc++.
#include <vector> #include <boost/phoenix.hpp> int main() { std::vector< int > hoge; std::vector< int > fuga; namespace phx = boost::phoenix; phx::insert( phx::placeholders::_1, phx::placeholders::_2, fuga.begin(), fuga.end() )( hoge, hoge.end() ); }
That is because phoenix::insert expects the member function insert returns void when was is called with 3 arguments. That is correct in C++03 but not in C++11.( All insert overloads returns an iterator in C++11 [23.3.7.1] )
Since libstdc++ returns void even if the code was compiled as C++11, the problem doesn't appear. But at least with libc++, it fails to compile and following error message is produced.
void function 'operator()' should not return a value [-Wreturn-type] return c.insert(arg1, arg2, arg3); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
This patch fixed the problem on libc++. I think it needs more intelligent way to detect environments those insert always return a iterator. But I don't have any good idea on that :(
--- boost/phoenix/stl/container/container.hpp +++ boost/phoenix/stl/container/container.hpp @@ -425,6 +425,9 @@ choice_1; typedef +#ifdef _LIBCPP_VERSION + iterator_of<C> +#else boost::mpl::eval_if_c< boost::mpl::and_< boost::is_same<Arg3, mpl::void_> @@ -433,8 +436,8 @@ , iterator_of<C> , boost::mpl::identity<void> > +#endif choice_2; - public: typedef typename
It might be already fixed in 4da68d2b04c8128b010e609697602991cbc17333, but next (1.63) release has better implementation c378960d48c0b3966a3f996b0144944dca954b86 .