libstdc++/ranges: Implement LWG 3599 change to lazy_split_view
Checks
| Context |
Check |
Description |
| linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
success
|
Build passed
|
Commit Message
Tested on x86_64-pc-linux-gnu, does this look OK for trunk/backports?
-- >8 --
libstdc++-v3/ChangeLog:
* include/std/ranges (lazy_split_view::begin): Add
const _Pattern contraint on const overload as per LWG 3599.
(lazy_split_view::end): Likewise.
* testsuite/std/ranges/adaptors/lazy_split.cc (test14): New
test.
---
libstdc++-v3/include/std/ranges | 4 +++-
.../testsuite/std/ranges/adaptors/lazy_split.cc | 10 ++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
Comments
OK
On Wed, 8 Apr 2026, 13:20 Patrick Palka, <ppalka@redhat.com> wrote:
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/backports?
>
> -- >8 --
>
> libstdc++-v3/ChangeLog:
>
> * include/std/ranges (lazy_split_view::begin): Add
> const _Pattern contraint on const overload as per LWG 3599.
> (lazy_split_view::end): Likewise.
> * testsuite/std/ranges/adaptors/lazy_split.cc (test14): New
> test.
> ---
> libstdc++-v3/include/std/ranges | 4 +++-
> .../testsuite/std/ranges/adaptors/lazy_split.cc | 10 ++++++++++
> 2 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/std/ranges
> b/libstdc++-v3/include/std/ranges
> index 0aa4191e04f6..41175fd45e4b 100644
> --- a/libstdc++-v3/include/std/ranges
> +++ b/libstdc++-v3/include/std/ranges
> @@ -3809,6 +3809,7 @@ namespace views::__adaptor
>
> constexpr auto
> begin() const requires forward_range<_Vp> && forward_range<const
> _Vp>
> + && forward_range<const _Pattern>
> {
> return _OuterIter<true>{this, ranges::begin(_M_base)};
> }
> @@ -3826,7 +3827,8 @@ namespace views::__adaptor
> {
> if constexpr (forward_range<_Vp>
> && forward_range<const _Vp>
> - && common_range<const _Vp>)
> + && common_range<const _Vp>
> + && forward_range<const _Pattern>)
> return _OuterIter<true>{this, ranges::end(_M_base)};
> else
> return default_sentinel;
> diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/lazy_split.cc
> b/libstdc++-v3/testsuite/std/ranges/adaptors/lazy_split.cc
> index 60ee7d70580e..1c69b8f27cfd 100644
> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/lazy_split.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/lazy_split.cc
> @@ -239,6 +239,15 @@ test13()
> constexpr decltype(views::lazy_split(views::single(0), 0).begin()) it;
> }
>
> +void
> +test14()
> +{
> + // LWG 3599
> + auto p = views::iota(0) | views::take(1) | views::reverse;
> + auto r = views::single(42) | views::lazy_split(p);
> + auto f = r.front();
> +}
> +
> int
> main()
> {
> @@ -255,4 +264,5 @@ main()
> test11();
> static_assert(test12());
> test13();
> + test14();
> }
> --
> 2.54.0.rc0.180.g7c4e9e957a
>
>
@@ -3809,6 +3809,7 @@ namespace views::__adaptor
constexpr auto
begin() const requires forward_range<_Vp> && forward_range<const _Vp>
+ && forward_range<const _Pattern>
{
return _OuterIter<true>{this, ranges::begin(_M_base)};
}
@@ -3826,7 +3827,8 @@ namespace views::__adaptor
{
if constexpr (forward_range<_Vp>
&& forward_range<const _Vp>
- && common_range<const _Vp>)
+ && common_range<const _Vp>
+ && forward_range<const _Pattern>)
return _OuterIter<true>{this, ranges::end(_M_base)};
else
return default_sentinel;
@@ -239,6 +239,15 @@ test13()
constexpr decltype(views::lazy_split(views::single(0), 0).begin()) it;
}
+void
+test14()
+{
+ // LWG 3599
+ auto p = views::iota(0) | views::take(1) | views::reverse;
+ auto r = views::single(42) | views::lazy_split(p);
+ auto f = r.front();
+}
+
int
main()
{
@@ -255,4 +264,5 @@ main()
test11();
static_assert(test12());
test13();
+ test14();
}