libstdc++/ranges: Implement LWG 3599 change to lazy_split_view

Message ID 20260408121941.4047772-1-ppalka@redhat.com
State New
Headers
Series 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

Patrick Palka April 8, 2026, 12:19 p.m. UTC
  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

Jonathan Wakely April 8, 2026, 12:34 p.m. UTC | #1
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
>
>
  

Patch

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();
 }