Index: include/numeric =================================================================== --- include/numeric +++ include/numeric @@ -163,7 +163,7 @@ accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) { for (; __first != __last; ++__first) - __init = __init + *__first; + __init = _VSTD::move(__init) + *__first; return __init; } @@ -173,7 +173,7 @@ accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) { for (; __first != __last; ++__first) - __init = __binary_op(__init, *__first); + __init = __binary_op(_VSTD::move(__init), *__first); return __init; } @@ -212,7 +212,7 @@ inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) { for (; __first1 != __last1; ++__first1, (void) ++__first2) - __init = __init + *__first1 * *__first2; + __init = _VSTD::move(__init) + *__first1 * *__first2; return __init; } @@ -223,7 +223,7 @@ _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) { for (; __first1 != __last1; ++__first1, (void) ++__first2) - __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); + __init = __binary_op1(_VSTD::move(__init), __binary_op2(*__first1, *__first2)); return __init; } @@ -270,11 +270,11 @@ if (__first != __last) { typename iterator_traits<_InputIterator>::value_type __t(*__first); - *__result = __t; + *__result = _VSTD::move(__t); for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) { - __t = __t + *__first; - *__result = __t; + __t = _VSTD::move(__t) + *__first; + *__result = _VSTD::move(__t); } } return __result; @@ -289,11 +289,11 @@ if (__first != __last) { typename iterator_traits<_InputIterator>::value_type __t(*__first); - *__result = __t; + *__result = _VSTD::move(__t); for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) { - __t = __binary_op(__t, *__first); - *__result = __t; + __t = __binary_op(_VSTD::move(__t), *__first); + *__result = _VSTD::move(__t); } } return __result; @@ -418,11 +418,11 @@ if (__first != __last) { typename iterator_traits<_InputIterator>::value_type __t1(*__first); - *__result = __t1; + *__result = _VSTD::move(__t1); for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) { typename iterator_traits<_InputIterator>::value_type __t2(*__first); - *__result = __t2 - __t1; + *__result = _VSTD::move(__t2) - __t1; __t1 = _VSTD::move(__t2); } } @@ -438,11 +438,11 @@ if (__first != __last) { typename iterator_traits<_InputIterator>::value_type __t1(*__first); - *__result = __t1; + *__result = _VSTD::move(__t1); for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) { typename iterator_traits<_InputIterator>::value_type __t2(*__first); - *__result = __binary_op(__t2, __t1); + *__result = __binary_op(_VSTD::move(__t2), __t1); __t1 = _VSTD::move(__t2); } } @@ -565,7 +565,7 @@ enable_if_t, _Fp> midpoint(_Fp __a, _Fp __b) noexcept { - return isnormal(__a) && isnormal(__b) + return isnormal(__a) && isnormal(__b) && ((__sign(__a) != __sign(__b)) || ((numeric_limits<_Fp>::max() - abs(__a)) < abs(__b))) ? __a / 2 + __b / 2 : (__a + __b) / 2; Index: test/std/numerics/numeric.ops/accumulate/accumulate_op.pass.cpp =================================================================== --- test/std/numerics/numeric.ops/accumulate/accumulate_op.pass.cpp +++ test/std/numerics/numeric.ops/accumulate/accumulate_op.pass.cpp @@ -21,6 +21,25 @@ #include "test_iterators.h" +struct force_move +{ + void operator= (force_move const&) { } + auto operator()(force_move const&&, force_move const&) { return *this; } +}; + +template +force_move operator+(force_move const&& a, T const&) +{ return a; } + +void +test_use_move() +{ + std::size_t size = 100; + force_move arr[size]; + std::accumulate(arr, arr + size, force_move()); + std::accumulate(arr, arr + size, force_move(), force_move()); +} + template void test(Iter first, Iter last, T init, T x) @@ -52,5 +71,7 @@ test >(); test(); - return 0; + test_use_move(); + + return 0; } Index: test/std/numerics/numeric.ops/adjacent.difference/adjacent_difference_op.pass.cpp =================================================================== --- test/std/numerics/numeric.ops/adjacent.difference/adjacent_difference_op.pass.cpp +++ test/std/numerics/numeric.ops/adjacent.difference/adjacent_difference_op.pass.cpp @@ -25,6 +25,25 @@ #include "test_macros.h" #include "test_iterators.h" +struct force_move +{ + void operator= (force_move const&) { } + auto operator()(force_move const&&, force_move const&) { return *this; } +}; + +template +force_move operator-(force_move const&& a, T const&) +{ return a; } + +void +test_use_move() +{ + std::size_t size = 100; + force_move arr[size]; + std::adjacent_difference(arr, arr + size, arr); + std::adjacent_difference(arr, arr + size, arr, force_move()); +} + template void test() @@ -116,5 +135,7 @@ std::adjacent_difference(x, x+3, y, std::minus()); #endif - return 0; + test_use_move(); + + return 0; } Index: test/std/numerics/numeric.ops/inner.product/inner_product_comp.pass.cpp =================================================================== --- test/std/numerics/numeric.ops/inner.product/inner_product_comp.pass.cpp +++ test/std/numerics/numeric.ops/inner.product/inner_product_comp.pass.cpp @@ -25,6 +25,33 @@ #include "test_iterators.h" +struct force_move +{ + void operator= (force_move const&) { } + auto operator* (force_move const&) { return *this; } + auto operator()(force_move const&&, force_move const&) { return *this; } +}; + +template +force_move operator+(force_move const&& a, T const&) +{ return a; } + +struct do_nothing_op +{ + template + T operator()(T a, T) + { return a; } +}; + +void +test_use_move() +{ + std::size_t size = 100; + force_move arr[size]; + std::inner_product(arr, arr + size, arr, force_move()); + std::inner_product(arr, arr + size, arr, force_move(), force_move(), do_nothing_op()); +} + template void test(Iter1 first1, Iter1 last1, Iter2 first2, T init, T x) @@ -82,5 +109,7 @@ test >(); test(); - return 0; + test_use_move(); + + return 0; } Index: test/std/numerics/numeric.ops/partial.sum/partial_sum_op.pass.cpp =================================================================== --- test/std/numerics/numeric.ops/partial.sum/partial_sum_op.pass.cpp +++ test/std/numerics/numeric.ops/partial.sum/partial_sum_op.pass.cpp @@ -23,6 +23,25 @@ #include "test_iterators.h" +struct force_move +{ + void operator= (force_move const&) { } + auto operator()(force_move const&&, force_move const&) { return *this; } +}; + +template +force_move operator+(force_move const&& a, T const&) +{ return a; } + +void +test_use_move() +{ + std::size_t size = 100; + force_move arr[size]; + std::partial_sum(arr, arr + size, arr); + std::partial_sum(arr, arr + size, arr, force_move()); +} + template void test() @@ -69,5 +88,7 @@ test >(); test(); - return 0; + test_use_move(); + + return 0; }