From 70a8aae2984f65bd612953e6db54e39d4259cdd8 Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Fri, 5 Jan 2018 01:31:57 +0000 Subject: [PATCH] Fix incorrect handling of move-only types in transform_reduce iter iter iter init, and add test. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@321851 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/numeric | 2 +- ...nsform_reduce_iter_iter_iter_init.pass.cpp | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/numeric b/include/numeric index 0197a28d8..b33b6a398 100644 --- a/include/numeric +++ b/include/numeric @@ -252,7 +252,7 @@ _Tp transform_reduce(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) { - return _VSTD::transform_reduce(__first1, __last1, __first2, __init, + return _VSTD::transform_reduce(__first1, __last1, __first2, _VSTD::move(__init), _VSTD::plus<>(), _VSTD::multiplies<>()); } #endif diff --git a/test/std/numerics/numeric.ops/transform.reduce/transform_reduce_iter_iter_iter_init.pass.cpp b/test/std/numerics/numeric.ops/transform.reduce/transform_reduce_iter_iter_iter_init.pass.cpp index 4f8142afe..b2c2d7145 100644 --- a/test/std/numerics/numeric.ops/transform.reduce/transform_reduce_iter_iter_iter_init.pass.cpp +++ b/test/std/numerics/numeric.ops/transform.reduce/transform_reduce_iter_iter_iter_init.pass.cpp @@ -17,7 +17,9 @@ #include #include +#include +#include "MoveOnly.h" #include "test_iterators.h" template @@ -56,6 +58,24 @@ void test_return_type() decltype(std::transform_reduce(p, p, p, Init{}))> ); } +inline MoveOnly operator+(const MoveOnly& lhs, const MoveOnly& rhs) +{ + return MoveOnly{lhs.get() + rhs.get()}; +} + +inline MoveOnly operator*(const MoveOnly& lhs, const MoveOnly& rhs) +{ + return MoveOnly{lhs.get() * rhs.get()}; +} + +void test_move_only_types() +{ + MoveOnly ia[] = {{1}, {2}, {3}}; + MoveOnly ib[] = {{1}, {2}, {3}}; + assert(14 == + std::transform_reduce(std::begin(ia), std::end(ia), std::begin(ib), MoveOnly{0}).get()); +} + int main() { test_return_type(); @@ -92,4 +112,6 @@ int main() test(); test< int*, const unsigned int *>(); test< int*, unsigned int *>(); + + test_move_only_types(); }