* [PATCH] libstdc++: Implement P2836R1 changes to const_iterator
@ 2024-01-15 18:49 Patrick Palka
2024-01-15 19:04 ` Jonathan Wakely
0 siblings, 1 reply; 2+ messages in thread
From: Patrick Palka @ 2024-01-15 18:49 UTC (permalink / raw)
To: gcc-patches; +Cc: libstdc++, Patrick Palka
Tested on x86_64-pc-linux-gnu, does this look OK for trunk/13?
libstdc++-v3/ChangeLog:
* include/bits/stl_iterator.h (const_iterator): Define
conversion operators as per P2836R1.
* include/bits/version.def (ranges_as_const): Update value.
* include/bits/version.h: Regenerate.
* testsuite/24_iterators/const_iterator/1.cc (test04): New test.
* testsuite/std/ranges/adaptors/as_const/1.cc: Adjust expected
value of __cpp_lib_ranges_as_const.
* testsuite/std/ranges/version_c++23.cc: Likewise.
---
libstdc++-v3/include/bits/stl_iterator.h | 12 ++++++++++
libstdc++-v3/include/bits/version.def | 2 +-
libstdc++-v3/include/bits/version.h | 4 ++--
.../24_iterators/const_iterator/1.cc | 22 +++++++++++++++++++
.../std/ranges/adaptors/as_const/1.cc | 2 +-
.../testsuite/std/ranges/version_c++23.cc | 2 +-
6 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h
index 6434ef64750..d71a793e10d 100644
--- a/libstdc++-v3/include/bits/stl_iterator.h
+++ b/libstdc++-v3/include/bits/stl_iterator.h
@@ -2775,6 +2775,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
noexcept(noexcept(_M_current == __s))
{ return _M_current == __s; }
+ template<__detail::__not_a_const_iterator _CIt>
+ requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
+ constexpr
+ operator _CIt() const&
+ { return _M_current; }
+
+ template<__detail::__not_a_const_iterator _CIt>
+ requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
+ constexpr
+ operator _CIt() &&
+ { return std::move(_M_current); }
+
constexpr bool
operator<(const basic_const_iterator& __y) const
noexcept(noexcept(_M_current < __y._M_current))
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
index 21cdc65121b..afbec6c3e6a 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -1548,7 +1548,7 @@ ftms = {
ftms = {
name = ranges_as_const;
values = {
- v = 202207;
+ v = 202311;
cxxmin = 23;
};
};
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
index f8dd16416a4..9688b246ef4 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -1875,9 +1875,9 @@
// from version.def line 1549
#if !defined(__cpp_lib_ranges_as_const)
# if (__cplusplus >= 202100L)
-# define __glibcxx_ranges_as_const 202207L
+# define __glibcxx_ranges_as_const 202311L
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_ranges_as_const)
-# define __cpp_lib_ranges_as_const 202207L
+# define __cpp_lib_ranges_as_const 202311L
# endif
# endif
#endif /* !defined(__cpp_lib_ranges_as_const) && defined(__glibcxx_want_ranges_as_const) */
diff --git a/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc b/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc
index 8b74d110fdf..fe952bfad14 100644
--- a/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc
+++ b/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc
@@ -1,6 +1,7 @@
// { dg-do run { target c++23 } }
#include <iterator>
+#include <ranges>
#include <array>
#include <concepts>
#include <string_view>
@@ -97,6 +98,26 @@ test03()
std::unreachable_sentinel_t> );
}
+void
+test04()
+{
+ // Example from P2836R1
+ auto f = [](std::vector<int>::const_iterator i) {};
+
+ auto v = std::vector<int>();
+ {
+ auto i1 = ranges::cbegin(v); // returns vector<T>::const_iterator
+ f(i1); // okay
+ }
+
+ auto t = v | std::views::take_while([](int const x) { return x < 100; });
+ {
+ auto i2 = ranges::cbegin(t); // returns basic_const_iterator<vector<T>::iterator>
+ f(i2); // was an error in C++23 before P2836R1
+ f(std::move(i2)); // same
+ }
+}
+
int
main()
{
@@ -136,4 +157,5 @@ main()
test02<const std::vector<bool>, true>();
test03();
+ test04();
}
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
index 2d36e0a4712..c36786a8c5f 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
@@ -3,7 +3,7 @@
#include <ranges>
-#if __cpp_lib_ranges_as_const != 202207L
+#if __cpp_lib_ranges_as_const != 202311L
# error "Feature-test macro __cpp_lib_ranges_as_const has wrong value in <ranges>"
#endif
diff --git a/libstdc++-v3/testsuite/std/ranges/version_c++23.cc b/libstdc++-v3/testsuite/std/ranges/version_c++23.cc
index 823264f32aa..d475d3dc114 100644
--- a/libstdc++-v3/testsuite/std/ranges/version_c++23.cc
+++ b/libstdc++-v3/testsuite/std/ranges/version_c++23.cc
@@ -45,7 +45,7 @@
# error "Feature-test macro __cpp_lib_ranges_as_rvalue has wrong value in <version>"
#endif
-#if __cpp_lib_ranges_as_const != 202207L
+#if __cpp_lib_ranges_as_const != 202311L
# error "Feature-test macro __cpp_lib_ranges_as_const has wrong value in <version>"
#endif
--
2.43.0.334.gd4dbce1db5
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] libstdc++: Implement P2836R1 changes to const_iterator
2024-01-15 18:49 [PATCH] libstdc++: Implement P2836R1 changes to const_iterator Patrick Palka
@ 2024-01-15 19:04 ` Jonathan Wakely
0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Wakely @ 2024-01-15 19:04 UTC (permalink / raw)
To: Patrick Palka; +Cc: gcc-patches, libstdc++
On Mon, 15 Jan 2024 at 18:50, Patrick Palka <ppalka@redhat.com> wrote:
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/13?
OK for both, thanks.
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/stl_iterator.h (const_iterator): Define
> conversion operators as per P2836R1.
> * include/bits/version.def (ranges_as_const): Update value.
> * include/bits/version.h: Regenerate.
> * testsuite/24_iterators/const_iterator/1.cc (test04): New test.
> * testsuite/std/ranges/adaptors/as_const/1.cc: Adjust expected
> value of __cpp_lib_ranges_as_const.
> * testsuite/std/ranges/version_c++23.cc: Likewise.
> ---
> libstdc++-v3/include/bits/stl_iterator.h | 12 ++++++++++
> libstdc++-v3/include/bits/version.def | 2 +-
> libstdc++-v3/include/bits/version.h | 4 ++--
> .../24_iterators/const_iterator/1.cc | 22 +++++++++++++++++++
> .../std/ranges/adaptors/as_const/1.cc | 2 +-
> .../testsuite/std/ranges/version_c++23.cc | 2 +-
> 6 files changed, 39 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h
> index 6434ef64750..d71a793e10d 100644
> --- a/libstdc++-v3/include/bits/stl_iterator.h
> +++ b/libstdc++-v3/include/bits/stl_iterator.h
> @@ -2775,6 +2775,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> noexcept(noexcept(_M_current == __s))
> { return _M_current == __s; }
>
> + template<__detail::__not_a_const_iterator _CIt>
> + requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
> + constexpr
> + operator _CIt() const&
> + { return _M_current; }
> +
> + template<__detail::__not_a_const_iterator _CIt>
> + requires __detail::__constant_iterator<_CIt> && convertible_to<_It, _CIt>
> + constexpr
> + operator _CIt() &&
> + { return std::move(_M_current); }
> +
> constexpr bool
> operator<(const basic_const_iterator& __y) const
> noexcept(noexcept(_M_current < __y._M_current))
> diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
> index 21cdc65121b..afbec6c3e6a 100644
> --- a/libstdc++-v3/include/bits/version.def
> +++ b/libstdc++-v3/include/bits/version.def
> @@ -1548,7 +1548,7 @@ ftms = {
> ftms = {
> name = ranges_as_const;
> values = {
> - v = 202207;
> + v = 202311;
> cxxmin = 23;
> };
> };
> diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
> index f8dd16416a4..9688b246ef4 100644
> --- a/libstdc++-v3/include/bits/version.h
> +++ b/libstdc++-v3/include/bits/version.h
> @@ -1875,9 +1875,9 @@
> // from version.def line 1549
> #if !defined(__cpp_lib_ranges_as_const)
> # if (__cplusplus >= 202100L)
> -# define __glibcxx_ranges_as_const 202207L
> +# define __glibcxx_ranges_as_const 202311L
> # if defined(__glibcxx_want_all) || defined(__glibcxx_want_ranges_as_const)
> -# define __cpp_lib_ranges_as_const 202207L
> +# define __cpp_lib_ranges_as_const 202311L
> # endif
> # endif
> #endif /* !defined(__cpp_lib_ranges_as_const) && defined(__glibcxx_want_ranges_as_const) */
> diff --git a/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc b/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc
> index 8b74d110fdf..fe952bfad14 100644
> --- a/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc
> +++ b/libstdc++-v3/testsuite/24_iterators/const_iterator/1.cc
> @@ -1,6 +1,7 @@
> // { dg-do run { target c++23 } }
>
> #include <iterator>
> +#include <ranges>
> #include <array>
> #include <concepts>
> #include <string_view>
> @@ -97,6 +98,26 @@ test03()
> std::unreachable_sentinel_t> );
> }
>
> +void
> +test04()
> +{
> + // Example from P2836R1
> + auto f = [](std::vector<int>::const_iterator i) {};
> +
> + auto v = std::vector<int>();
> + {
> + auto i1 = ranges::cbegin(v); // returns vector<T>::const_iterator
> + f(i1); // okay
> + }
> +
> + auto t = v | std::views::take_while([](int const x) { return x < 100; });
> + {
> + auto i2 = ranges::cbegin(t); // returns basic_const_iterator<vector<T>::iterator>
> + f(i2); // was an error in C++23 before P2836R1
> + f(std::move(i2)); // same
> + }
> +}
> +
> int
> main()
> {
> @@ -136,4 +157,5 @@ main()
> test02<const std::vector<bool>, true>();
>
> test03();
> + test04();
> }
> diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> index 2d36e0a4712..c36786a8c5f 100644
> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> @@ -3,7 +3,7 @@
>
> #include <ranges>
>
> -#if __cpp_lib_ranges_as_const != 202207L
> +#if __cpp_lib_ranges_as_const != 202311L
> # error "Feature-test macro __cpp_lib_ranges_as_const has wrong value in <ranges>"
> #endif
>
> diff --git a/libstdc++-v3/testsuite/std/ranges/version_c++23.cc b/libstdc++-v3/testsuite/std/ranges/version_c++23.cc
> index 823264f32aa..d475d3dc114 100644
> --- a/libstdc++-v3/testsuite/std/ranges/version_c++23.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/version_c++23.cc
> @@ -45,7 +45,7 @@
> # error "Feature-test macro __cpp_lib_ranges_as_rvalue has wrong value in <version>"
> #endif
>
> -#if __cpp_lib_ranges_as_const != 202207L
> +#if __cpp_lib_ranges_as_const != 202311L
> # error "Feature-test macro __cpp_lib_ranges_as_const has wrong value in <version>"
> #endif
>
> --
> 2.43.0.334.gd4dbce1db5
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-01-15 19:05 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-15 18:49 [PATCH] libstdc++: Implement P2836R1 changes to const_iterator Patrick Palka
2024-01-15 19:04 ` Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).