libstdc++: Add enable_borrowed_range<as_input_view<V>> [PR125785]

Message ID 20261001211350.3184707-1-jwakely@redhat.com
State New
Headers
Series libstdc++: Add enable_borrowed_range<as_input_view<V>> [PR125785] |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed

Commit Message

Jonathan Wakely Oct. 1, 2026, 9:13 p.m. UTC
  Add the missing partial specialization, and test for it.

Also add tests for the as_const_view and as_rvalue_view partial
specializations that weren't being tested.

libstdc++-v3/ChangeLog:

	PR libstdc++/125785
	* include/std/ranges (enable_borrowed_range<as_input_view<T>>):
	Define partial specialization.
	* testsuite/std/ranges/adaptors/as_input/1.cc: Test
	specialization for as_input_view.
	* testsuite/std/ranges/adaptors/as_const/1.cc: Test
	specialization for as_const_view.
	* testsuite/std/ranges/adaptors/as_rvalue/1.cc: Test
	specialization for as_rvalue_view.
---

Tested x86_64-linux.

 libstdc++-v3/include/std/ranges                     |  4 ++++
 .../testsuite/std/ranges/adaptors/as_const/1.cc     | 13 +++++++++++++
 .../testsuite/std/ranges/adaptors/as_input/1.cc     | 13 +++++++++++++
 .../testsuite/std/ranges/adaptors/as_rvalue/1.cc    | 13 +++++++++++++
 4 files changed, 43 insertions(+)
  

Comments

Tomasz Kaminski Oct. 2, 2026, 5:09 a.m. UTC | #1
On Thu, Oct 1, 2026 at 11:14 PM Jonathan Wakely <jwakely@redhat.com> wrote:

> Add the missing partial specialization, and test for it.
>
> Also add tests for the as_const_view and as_rvalue_view partial
> specializations that weren't being tested.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/125785
>         * include/std/ranges (enable_borrowed_range<as_input_view<T>>):
>         Define partial specialization.
>         * testsuite/std/ranges/adaptors/as_input/1.cc: Test
>         specialization for as_input_view.
>         * testsuite/std/ranges/adaptors/as_const/1.cc: Test
>         specialization for as_const_view.
>         * testsuite/std/ranges/adaptors/as_rvalue/1.cc: Test
>         specialization for as_rvalue_view.
> ---
>
> Tested x86_64-linux.
>
One suggestion for simplifying the test otherwise LGTM.

>
>  libstdc++-v3/include/std/ranges                     |  4 ++++
>  .../testsuite/std/ranges/adaptors/as_const/1.cc     | 13 +++++++++++++
>  .../testsuite/std/ranges/adaptors/as_input/1.cc     | 13 +++++++++++++
>  .../testsuite/std/ranges/adaptors/as_rvalue/1.cc    | 13 +++++++++++++
>  4 files changed, 43 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/ranges
> b/libstdc++-v3/include/std/ranges
> index dde4ed90080d..37f048e3d0d3 100644
> --- a/libstdc++-v3/include/std/ranges
> +++ b/libstdc++-v3/include/std/ranges
> @@ -10581,6 +10581,10 @@ namespace ranges
>    template<typename _Range>
>      as_input_view(_Range&&) -> as_input_view<views::all_t<_Range>>;
>
> +  template<typename _Vp>
> +    inline constexpr bool enable_borrowed_range<as_input_view<_Vp>>
> +      = enable_borrowed_range<_Vp>;
> +
>    template<input_range _Vp>
>      requires view<_Vp>
>    template<bool _Const>
> 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 5ccf47d4d300..ab525d861e39 100644
> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
> @@ -81,6 +81,19 @@ test04()
>    VERIFY( ranges::equal(v, x) );
>  }
>
> +struct X { };
> +using Owning = __gnu_test::test_forward_range<X>;
> +template<> constexpr bool ranges::enable_view<Owning> = true;
> +template<> constexpr bool ranges::enable_borrowed_range<Owning> = false;
> +
> +struct Y { };
> +using Borrowed = __gnu_test::test_forward_range<Y>;
> +template<> constexpr bool ranges::enable_view<Borrowed> = true;
> +template<> constexpr bool ranges::enable_borrowed_range<Borrowed> = true;
> +
> +static_assert( !
> ranges::enable_borrowed_range<ranges::as_const_view<Owning>> );
> +static_assert(
> ranges::enable_borrowed_range<ranges::as_const_view<Borrowed>> );
> +
>  int
>  main()
>  {
> diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
> b/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
> index 8bd1a82a7b7f..147b2d118512 100644
> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
> @@ -51,6 +51,19 @@ test02()
>                               decltype(x | views::as_input |
> views::as_input)> );
>  }
>
> +struct X { };
> +using Owning = __gnu_test::test_forward_range<X>;
> +template<> constexpr bool ranges::enable_view<Owning> = true;
> +template<> constexpr bool ranges::enable_borrowed_range<Owning> = false;
> +
> +struct Y { };
> +using Borrowed = __gnu_test::test_forward_range<Y>;
> +template<> constexpr bool ranges::enable_view<Borrowed> = true;
> +template<> constexpr bool ranges::enable_borrowed_range<Borrowed> = true;
> +
> +static_assert( !
> ranges::enable_borrowed_range<ranges::as_input_view<Owning>> );
> +static_assert(
> ranges::enable_borrowed_range<ranges::as_input_view<Borrowed>> );
>
I just use span as the Borrowed view example and single_view as the Owning
view example.
Would do that here. I think the declarations are unnecessary noise.

> +
>  int
>  main()
>  {
> diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
> b/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
> index 487700773705..998f9f382ecc 100644
> --- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
> +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
> @@ -55,6 +55,19 @@ test02()
>    VERIFY( *y == 42 );
>  }
>
> +struct X { };
> +using Owning = __gnu_test::test_forward_range<X>;
> +template<> constexpr bool ranges::enable_view<Owning> = true;
> +template<> constexpr bool ranges::enable_borrowed_range<Owning> = false;
> +
> +struct Y { };
> +using Borrowed = __gnu_test::test_forward_range<Y>;
> +template<> constexpr bool ranges::enable_view<Borrowed> = true;
> +template<> constexpr bool ranges::enable_borrowed_range<Borrowed> = true;
> +
> +static_assert( !
> ranges::enable_borrowed_range<ranges::as_rvalue_view<Owning>> );
> +static_assert(
> ranges::enable_borrowed_range<ranges::as_rvalue_view<Borrowed>> );
> +
>  int
>  main()
>  {
> --
> 2.55.0
>
>
  

Patch

diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index dde4ed90080d..37f048e3d0d3 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -10581,6 +10581,10 @@  namespace ranges
   template<typename _Range>
     as_input_view(_Range&&) -> as_input_view<views::all_t<_Range>>;
 
+  template<typename _Vp>
+    inline constexpr bool enable_borrowed_range<as_input_view<_Vp>>
+      = enable_borrowed_range<_Vp>;
+
   template<input_range _Vp>
     requires view<_Vp>
   template<bool _Const>
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 5ccf47d4d300..ab525d861e39 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc
@@ -81,6 +81,19 @@  test04()
   VERIFY( ranges::equal(v, x) );
 }
 
+struct X { };
+using Owning = __gnu_test::test_forward_range<X>;
+template<> constexpr bool ranges::enable_view<Owning> = true;
+template<> constexpr bool ranges::enable_borrowed_range<Owning> = false;
+
+struct Y { };
+using Borrowed = __gnu_test::test_forward_range<Y>;
+template<> constexpr bool ranges::enable_view<Borrowed> = true;
+template<> constexpr bool ranges::enable_borrowed_range<Borrowed> = true;
+
+static_assert( ! ranges::enable_borrowed_range<ranges::as_const_view<Owning>> );
+static_assert( ranges::enable_borrowed_range<ranges::as_const_view<Borrowed>> );
+
 int
 main()
 {
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
index 8bd1a82a7b7f..147b2d118512 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_input/1.cc
@@ -51,6 +51,19 @@  test02()
 			      decltype(x | views::as_input | views::as_input)> );
 }
 
+struct X { };
+using Owning = __gnu_test::test_forward_range<X>;
+template<> constexpr bool ranges::enable_view<Owning> = true;
+template<> constexpr bool ranges::enable_borrowed_range<Owning> = false;
+
+struct Y { };
+using Borrowed = __gnu_test::test_forward_range<Y>;
+template<> constexpr bool ranges::enable_view<Borrowed> = true;
+template<> constexpr bool ranges::enable_borrowed_range<Borrowed> = true;
+
+static_assert( ! ranges::enable_borrowed_range<ranges::as_input_view<Owning>> );
+static_assert( ranges::enable_borrowed_range<ranges::as_input_view<Borrowed>> );
+
 int
 main()
 {
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
index 487700773705..998f9f382ecc 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_rvalue/1.cc
@@ -55,6 +55,19 @@  test02()
   VERIFY( *y == 42 );
 }
 
+struct X { };
+using Owning = __gnu_test::test_forward_range<X>;
+template<> constexpr bool ranges::enable_view<Owning> = true;
+template<> constexpr bool ranges::enable_borrowed_range<Owning> = false;
+
+struct Y { };
+using Borrowed = __gnu_test::test_forward_range<Y>;
+template<> constexpr bool ranges::enable_view<Borrowed> = true;
+template<> constexpr bool ranges::enable_borrowed_range<Borrowed> = true;
+
+static_assert( ! ranges::enable_borrowed_range<ranges::as_rvalue_view<Owning>> );
+static_assert( ranges::enable_borrowed_range<ranges::as_rvalue_view<Borrowed>> );
+
 int
 main()
 {