From: Patrick Palka Date: Thu, 13 Mar 2025 13:15:21 +0000 (-0400) Subject: libstdc++: Fix ref_view branch of views::as_const [PR119135] X-Git-Tag: releases/gcc-14.3.0~353 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=925a744efec5a630eb9bf49e755c554a884fda99;p=thirdparty%2Fgcc.git libstdc++: Fix ref_view branch of views::as_const [PR119135] Unlike for span and empty_view, the range_reference_t of ref_view doesn't correspond to X. This patch fixes the ref_view branch of views::as_const to correctly query its underlying range type X. PR libstdc++/119135 libstdc++-v3/ChangeLog: * include/std/ranges: Include . (views::__detail::__is_ref_view): Replace with ... (views::__detail::__is_constable_ref_view): ... this. (views::_AsConst::operator()): Replace bogus use of element_type in the ref_view branch. * testsuite/std/ranges/adaptors/as_const/1.cc (test03): Extend test. Reviewed-by: Tomasz KamiƄski Reviewed-by: Jonathan Wakely (cherry picked from commit 50359c0a44381edb6dbd9359ef2ebdadbcc3ed42) --- diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index a966699479bb..c2dcb0265660 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -46,6 +46,7 @@ #include #include #if __cplusplus > 202002L +#include #include #endif #include @@ -9297,10 +9298,11 @@ namespace views::__adaptor namespace __detail { template - inline constexpr bool __is_ref_view = false; + inline constexpr bool __is_constable_ref_view = false; template - inline constexpr bool __is_ref_view> = true; + inline constexpr bool __is_constable_ref_view> + = constant_range; template concept __can_as_const_view = requires { as_const_view(std::declval<_Range>()); }; @@ -9322,10 +9324,8 @@ namespace views::__adaptor return views::empty; else if constexpr (std::__detail::__is_span<_Tp>) return span(std::forward<_Range>(__r)); - else if constexpr (__detail::__is_ref_view<_Tp> - && constant_range) - return ref_view(static_cast - (std::forward<_Range>(__r).base())); + else if constexpr (__detail::__is_constable_ref_view<_Tp>) + return ref_view(std::as_const(std::forward<_Range>(__r).base())); else if constexpr (is_lvalue_reference_v<_Range> && constant_range && !view<_Tp>) 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 c36786a8c5fa..3f1f8eb17726 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/as_const/1.cc @@ -63,6 +63,10 @@ test03() std::vector v; std::same_as>> auto r = views::as_const(v); + + // PR libstdc++/119135 + std::same_as>> + auto r2 = views::as_const(views::all(v)); } int