[PATCH 2/2] libstdc++: Add ranges::borrowed_range specialization for optional<T&> [PR122425]
Jonathan Wakely
jwakely.gcc@gmail.com
Thu Nov 6 20:05:18 GMT 2025
OK thanks
On Thu, 6 Nov 2025 at 16:07, Tomasz Kamiński <tkaminsk@redhat.com> wrote:
>
> PR libstdc++/122425
>
> libstdc++-v3/ChangeLog:
>
> * include/std/optional
> (ranges::enable_borrowed_range<optional<_Tp&>>): Define.
> * testsuite/20_util/optional/range.cc: Update tests.
> ---
> libstdc++-v3/include/std/optional | 6 ++++++
> libstdc++-v3/testsuite/20_util/optional/range.cc | 6 +++++-
> 2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
> index fad5f57a94c..5407fc74a41 100644
> --- a/libstdc++-v3/include/std/optional
> +++ b/libstdc++-v3/include/std/optional
> @@ -2178,6 +2178,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> inline constexpr bool
> ranges::enable_view<optional<_Tp>> = true;
>
> +#if __cpp_lib_optional >= 202506L // C++26
> + template<typename _Tp>
> + constexpr bool
> + ranges::enable_borrowed_range<optional<_Tp&>> = true;
> +#endif
> +
> template<typename _Tp>
> inline constexpr range_format
> format_kind<optional<_Tp>> = range_format::disabled;
> diff --git a/libstdc++-v3/testsuite/20_util/optional/range.cc b/libstdc++-v3/testsuite/20_util/optional/range.cc
> index 1cb3eb6ceff..981969cb614 100644
> --- a/libstdc++-v3/testsuite/20_util/optional/range.cc
> +++ b/libstdc++-v3/testsuite/20_util/optional/range.cc
> @@ -19,12 +19,16 @@ test_range_concepts()
> static_assert(std::ranges::contiguous_range<O>);
> static_assert(std::ranges::sized_range<O>);
> static_assert(std::ranges::common_range<O>);
> - static_assert(!std::ranges::borrowed_range<O>);
> +
> + // an optional<T&> is borrowed range
> + constexpr bool is_ref_opt = std::is_reference_v<T>;
> + static_assert(std::ranges::borrowed_range<O> == is_ref_opt);
>
> // an optional<const T> is not assignable, and therefore does not satisfy ranges::view
> constexpr bool is_const_opt = std::is_const_v<T>;
> static_assert(std::ranges::view<O> == !is_const_opt);
> static_assert(std::ranges::viewable_range<O> == !is_const_opt);
> +
> }
>
> template<typename O>
> --
> 2.51.0
>
More information about the Libstdc++
mailing list