reduce(_InputIterator __first, _InputIterator __last, _Tp __init,
_BinaryOperation __binary_op)
{
- using value_type = typename iterator_traits<_InputIterator>::value_type;
+ using __ref = typename iterator_traits<_InputIterator>::reference;
+ static_assert(is_invocable_r_v<_Tp, _BinaryOperation&, _Tp&, __ref>);
+ static_assert(is_invocable_r_v<_Tp, _BinaryOperation&, __ref, _Tp&>);
static_assert(is_invocable_r_v<_Tp, _BinaryOperation&, _Tp&, _Tp&>);
- static_assert(is_convertible_v<value_type, _Tp>);
+ static_assert(is_invocable_r_v<_Tp, _BinaryOperation&, __ref, __ref>);
if constexpr (__is_random_access_iter<_InputIterator>::value)
{
while ((__last - __first) >= 4)
--- /dev/null
+// { dg-do compile { target c++17 } }
+// PR libstdc++/95833 - Incorrect static_assert in std::reduce overload
+
+#include <numeric>
+
+struct A { };
+struct B { };
+
+struct binop
+{
+ template<typename T, typename U>
+ A operator()(T&&, U&&) const { return A{}; }
+};
+
+B b;
+A a = std::reduce(&b, &b + 1, A{}, binop{});