[PATCH] libstdc++: Reject using views::iota on iota_view.
Tomasz Kamiński
tkaminsk@redhat.com
Fri Apr 24 11:13:33 GMT 2026
Resolves LWG4096, views::iota(views::iota(0)) should be rejected.
For __e of type _Tp that is specialization of iota_view, the CTAD based
expression iota_view(e) is well formed, and creates a copy of e.
As iota_view<decay_t<_Tp>> is ill-formed in this case (iota_view is not
weakly_incrementable), using that type in return type explicitly, removes
the overloads from overload resolution in this case.
The (now redudant) __detail::__can_iota_view constrain in template head is
perserved, to provide error messages consistent with other adaptors,
for other non-incrementable types.
libstdc++-v3/ChangeLog:
* include/std/ranges (_Iota::opeartor()(_Tp&&)): Replace
auto return type and CTAD with iota_view<decay_t<_Tp>>.
* testsuite/std/ranges/iota/iota_view.cc: Tests if
views::iota(iota_view) is rejected.
---
Testing on x86_64-linux. All *iota_view* tests alraedy passed.
OK for trunk when all tests passes?
libstdc++-v3/include/std/ranges | 6 ++++--
libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc | 11 +++++++++++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 24416b659c1..55d3c520ba4 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -900,10 +900,12 @@ namespace views
struct _Iota
{
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 4096. views::iota(views::iota(0)) should be rejected
template<__detail::__can_iota_view _Tp>
- constexpr auto
+ constexpr iota_view<decay_t<_Tp>>
operator() [[nodiscard]] (_Tp&& __e) const
- { return iota_view(std::forward<_Tp>(__e)); }
+ { return iota_view<decay_t<_Tp>>(std::forward<_Tp>(__e)); }
template<typename _Tp, typename _Up>
requires __detail::__can_iota_view<_Tp, _Up>
diff --git a/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc b/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc
index f3fddbd3531..7b748cf9c3a 100644
--- a/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc
+++ b/libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc
@@ -22,6 +22,17 @@
#include <vector>
#include <testsuite_hooks.h>
+template<typename Inc>
+concept can_iota = requires (Inc&& __inc)
+{ std::views::iota(__inc); };
+
+static_assert( can_iota<int> );
+static_assert( can_iota<int*> );
+static_assert( !can_iota<std::ranges::iota_view<int>> );
+static_assert( !can_iota<const std::ranges::iota_view<int>> );
+static_assert( !can_iota<std::ranges::iota_view<int>&> );
+static_assert( !can_iota<const std::ranges::iota_view<int>&> );
+
void
test01()
{
--
2.53.0
More information about the Libstdc++
mailing list