Opened 10 years ago

Closed 10 years ago

#7619 closed Bugs (invalid)

Compiler error with move and packaged_task

Reported by: anonymous Owned by: viboes
Milestone: To Be Determined Component: thread
Version: Boost 1.51.0 Severity: Regression
Keywords: move, packaged_task, futures, io_service Cc:

Description

Consider the following simple code:

// mt_test.cpp
#include <boost/asio.hpp>
#include <boost/move/move.hpp>
#include <boost/thread.hpp>

int process_data()
{
	return 1;
}

int main()
{
boost::asio::io_service io_service;
boost::asio::io_service::work work(io_service);

boost::packaged_task<int> task(boost::bind(&process_data));
io_service.post(boost::move(task));
} 

This generates the errors (using gcc version 4.6.3 and boost 1.51.0)

 g++ -I ./boost_1_51_0/ mt_test.cpp -o mt_test
In file included from ./boost_1_51_0/boost/asio/io_service.hpp:767:0,
                 from ./boost_1_51_0/boost/asio/basic_io_object.hpp:19,
                 from ./boost_1_51_0/boost/asio/basic_socket.hpp:19,
                 from ./boost_1_51_0/boost/asio/basic_datagram_socket.hpp:20,
                 from ./boost_1_51_0/boost/asio.hpp:20,
                 from mt_test.cpp:2:
./boost_1_51_0/boost/asio/impl/io_service.hpp: In member function ‘void boost::asio::io_service::post(const CompletionHandler&) [with CompletionHandler = boost::detail::thread_move_t<boost::packaged_task<int> >]’:
mt_test.cpp:18:34:   instantiated from here
./boost_1_51_0/boost/asio/impl/io_service.hpp:95:67: error: no match for call to ‘(boost::detail::thread_move_t<boost::packaged_task<int> >) ()’
In file included from ./boost_1_51_0/boost/asio/detail/handler_invoke_helpers.hpp:21:0,
                 from ./boost_1_51_0/boost/asio/detail/bind_handler.hpp:20,
                 from ./boost_1_51_0/boost/asio/detail/wrapped_handler.hpp:18,
                 from ./boost_1_51_0/boost/asio/io_service.hpp:24,
                 from ./boost_1_51_0/boost/asio/basic_io_object.hpp:19,
                 from ./boost_1_51_0/boost/asio/basic_socket.hpp:19,
                 from ./boost_1_51_0/boost/asio/basic_datagram_socket.hpp:20,
                 from ./boost_1_51_0/boost/asio.hpp:20,
                 from mt_test.cpp:2:
./boost_1_51_0/boost/asio/handler_invoke_hook.hpp: In function ‘void boost::asio::asio_handler_invoke(Function, ...) [with Function = boost::detail::thread_move_t<boost::packaged_task<int> >]’:
./boost_1_51_0/boost/asio/detail/handler_invoke_helpers.hpp:39:3:   instantiated from ‘void boost_asio_handler_invoke_helpers::invoke(Function&, Context&) [with Function = boost::detail::thread_move_t<boost::packaged_task<int> >, Context = boost::detail::thread_move_t<boost::packaged_task<int> >]’
./boost_1_51_0/boost/asio/detail/completion_handler.hpp:67:7:   instantiated from ‘static void boost::asio::detail::completion_handler<Handler>::do_complete(boost::asio::detail::io_service_impl*, boost::asio::detail::operation*, const boost::system::error_code&, std::size_t) [with Handler = boost::detail::thread_move_t<boost::packaged_task<int> >, boost::asio::detail::io_service_impl = boost::asio::detail::task_io_service, boost::asio::detail::operation = boost::asio::detail::task_io_service_operation, std::size_t = long unsigned int]’
./boost_1_51_0/boost/asio/detail/completion_handler.hpp:38:48:   instantiated from ‘boost::asio::detail::completion_handler<Handler>::completion_handler(Handler&) [with Handler = boost::detail::thread_move_t<boost::packaged_task<int> >]’
./boost_1_51_0/boost/asio/detail/impl/task_io_service.hpp:61:3:   instantiated from ‘void boost::asio::detail::task_io_service::post(Handler) [with Handler = boost::detail::thread_move_t<boost::packaged_task<int> >]’
./boost_1_51_0/boost/asio/impl/io_service.hpp:97:3:   instantiated from ‘void boost::asio::io_service::post(const CompletionHandler&) [with CompletionHandler = boost::detail::thread_move_t<boost::packaged_task<int> >]’
mt_test.cpp:18:34:   instantiated from here
./boost_1_51_0/boost/asio/handler_invoke_hook.hpp:64:3: error: no match for call to ‘(boost::detail::thread_move_t<boost::packaged_task<int> >) ()’


I thought this was solved in Ticket 4521?

Change History (3)

comment:1 by Ion Gaztañaga, 10 years ago

Component: movethreads
Owner: changed from Ion Gaztañaga to Anthony Williams

This seems a Boost.Thread related problem, as Boost.Thread has several move emulation modes. Changed component from Move to Thread to reflect this.

comment:2 by viboes, 10 years ago

Component: threadsthread
Owner: changed from Anthony Williams to viboes
Status: newassigned

I don't know if io_service.post accepts a Boost.Thread emulated rvalue reference. From the compiler error I will say that no.

Boost.Thread allows to work with Boost.Move emulation when BOOST_THREAD_USES_MOVE is defined. If asio is Boost.Move compatible this could be an option.

Anyway I don't think this is a bug with Boost.Thread.

comment:3 by viboes, 10 years ago

Resolution: invalid
Status: assignedclosed
Note: See TracTickets for help on using tickets.