diff --git a/src/butil/containers/mpsc_queue.h b/src/butil/containers/mpsc_queue.h index cbb48cb3f6..95c5a4062c 100644 --- a/src/butil/containers/mpsc_queue.h +++ b/src/butil/containers/mpsc_queue.h @@ -103,7 +103,7 @@ template void MPSCQueue::Enqueue(T&& data) { auto node = (MPSCQueueNode*)_alloc.Alloc(); node->next = MPSCQueueNode::UNCONNECTED; - node->data_mem.Init(data); + node->data_mem.Init(std::move(data)); EnqueueImpl(node); } diff --git a/test/mpsc_queue_unittest.cc b/test/mpsc_queue_unittest.cc index 800e45aeb5..97fb9ee450 100644 --- a/test/mpsc_queue_unittest.cc +++ b/test/mpsc_queue_unittest.cc @@ -158,6 +158,15 @@ TEST(MPSCQueueTest, destroys_dequeued_element) { ASSERT_EQ(0, DestructionTracked::alive); } +TEST(MPSCQueueTest, enqueue_move_only) { + butil::MPSCQueue> q; + q.Enqueue(std::make_unique(1)); + std::unique_ptr out; + ASSERT_TRUE(q.Dequeue(out)); + ASSERT_NE(nullptr, out); + ASSERT_EQ(1, *out); +} + TEST(MPSCQueueTest, mpsc_test_allocator) { butil::ObjectPoolAllocator alloc;