[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