[PATCH] libstdc++: Reject using views::iota on iota_view.
Jonathan Wakely
jwakely@redhat.com
Fri Apr 24 11:58:50 GMT 2026
On Fri, 24 Apr 2026 at 12:21, Tomasz Kamiński <tkaminsk@redhat.com> wrote:
>
> 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,
"preserved"
> for other non-incrementable types.
>
> libstdc++-v3/ChangeLog:
>
> * include/std/ranges (_Iota::opeartor()(_Tp&&)): Replace
"operator"
> 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?
OK with the two typos above fixed.
>
> 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