diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2024-10-13 21:47:14 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2024-10-14 22:07:28 +0100 |
commit | dde19c600c3c8a1d765c9b4961d2556e89edad14 (patch) | |
tree | 46edaa15d8c3f5635def484f7339a9101149f672 /libstdc++-v3/testsuite | |
parent | cacbb4daac3e9a9d86992fef1a7c607b4cee5f22 (diff) | |
download | gcc-dde19c600c3c8a1d765c9b4961d2556e89edad14.zip gcc-dde19c600c3c8a1d765c9b4961d2556e89edad14.tar.gz gcc-dde19c600c3c8a1d765c9b4961d2556e89edad14.tar.bz2 |
libstdc++: Implement LWG 3564 for ranges::transform_view
The _Iterator<true> 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<true>, as per LWG 3564.
* testsuite/std/ranges/adaptors/transform.cc: Check value_type
and iterator_category.
Reviewed-by: Patrick Palka <ppalka@redhat.com>
Diffstat (limited to 'libstdc++-v3/testsuite')
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc | 19 |
1 files changed, 19 insertions, 0 deletions
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<true>::value_type and iterator_category + // should use const F& + static_assert(std::same_as<std::iter_value_t<const_iterator>, int>); + using cat = std::iterator_traits<const_iterator>::iterator_category; + static_assert(std::same_as<cat, std::random_access_iterator_tag>); +} + int main() { @@ -208,4 +226,5 @@ main() test07(); test08(); test09(); + test10(); } |