aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-10-13 21:47:14 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2024-10-14 22:07:28 +0100
commitdde19c600c3c8a1d765c9b4961d2556e89edad14 (patch)
tree46edaa15d8c3f5635def484f7339a9101149f672 /libstdc++-v3/testsuite
parentcacbb4daac3e9a9d86992fef1a7c607b4cee5f22 (diff)
downloadgcc-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.cc19
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();
}