diff --git a/libcxx/include/__numeric/transform_inclusive_scan.h b/libcxx/include/__numeric/transform_inclusive_scan.h --- a/libcxx/include/__numeric/transform_inclusive_scan.h +++ b/libcxx/include/__numeric/transform_inclusive_scan.h @@ -42,7 +42,7 @@ _OutputIterator __result, _BinaryOp __b, _UnaryOp __u) { if (__first != __last) { - typename iterator_traits<_InputIterator>::value_type __init = __u(*__first); + auto __init = __u(*__first); *__result++ = __init; if (++__first != __last) return _VSTD::transform_inclusive_scan(__first, __last, __result, __b, __u, __init); diff --git a/libcxx/test/std/numerics/numeric.ops/transform.inclusive.scan/transform_inclusive_scan_bop_uop.pass.cpp b/libcxx/test/std/numerics/numeric.ops/transform.inclusive.scan/transform_inclusive_scan_bop_uop.pass.cpp --- a/libcxx/test/std/numerics/numeric.ops/transform.inclusive.scan/transform_inclusive_scan_bop_uop.pass.cpp +++ b/libcxx/test/std/numerics/numeric.ops/transform.inclusive.scan/transform_inclusive_scan_bop_uop.pass.cpp @@ -36,6 +36,25 @@ } }; +class MyInt { + int i_; + +public: + constexpr MyInt() = default; + constexpr MyInt(int i) : i_(i) {} + + constexpr int get() { return i_; } + + constexpr friend bool operator==(MyInt lhs, MyInt rhs) { return lhs.get() == rhs.get(); } +}; + +struct transform_to_type { + template + constexpr MyInt operator()(T) const { + return {}; + } +}; + template TEST_CONSTEXPR_CXX20 void test(Iter1 first, Iter1 last, BOp bop, UOp uop, const T *rFirst, const T *rLast) @@ -112,6 +131,18 @@ std::transform_inclusive_scan(v.begin(), v.end(), res.begin(), std::plus<>(), add_one{}); assert(res.empty()); } + + { + std::array a{1, 2, 3, 4}; + std::array b; + std::transform_inclusive_scan( + begin(a), + end(a), + begin(b), + [](MyInt lhs, MyInt rhs) { return MyInt{lhs.get() + rhs.get()}; }, + [](int i) { return MyInt{i + 1}; }); + assert((b == std::array{2, 5, 9, 14})); + } } TEST_CONSTEXPR_CXX20 bool