summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/include/std/optional6
-rw-r--r--libstdc++-v3/testsuite/20_util/optional/range.cc6
2 files changed, 11 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
index d191e51ed79..75a9531ccd5 100644
--- a/libstdc++-v3/include/std/optional
+++ b/libstdc++-v3/include/std/optional
@@ -2182,6 +2182,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>