From dde19c600c3c8a1d765c9b4961d2556e89edad14 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Sun, 13 Oct 2024 21:47:14 +0100 Subject: libstdc++: Implement LWG 3564 for ranges::transform_view The _Iterator type returned by begin() const uses const F& to transform the elements, so it should use const F& to determine the iterator's value_type and iterator_category as well. This was accepted into the WP in July 2022. libstdc++-v3/ChangeLog: * include/std/ranges (transform_view:_Iterator): Use const F& to determine value_type and iterator_category of _Iterator, as per LWG 3564. * testsuite/std/ranges/adaptors/transform.cc: Check value_type and iterator_category. Reviewed-by: Patrick Palka --- .../testsuite/std/ranges/adaptors/transform.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'libstdc++-v3/testsuite') diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc index bcb18a3..ca69534 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc @@ -196,6 +196,24 @@ test09() #endif } +void +test10() +{ + struct F { + short operator()(int) { return 0; } + const int& operator()(const int& i) const { return i; } + }; + + int x[] {2, 4}; + const auto xform = x | views::transform(F{}); + using const_iterator = decltype(xform.begin()); + // LWG 3564. transform_view::iterator::value_type and iterator_category + // should use const F& + static_assert(std::same_as, int>); + using cat = std::iterator_traits::iterator_category; + static_assert(std::same_as); +} + int main() { @@ -208,4 +226,5 @@ main() test07(); test08(); test09(); + test10(); } -- cgit v1.1