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(+)
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()
{
--
2.55.0