From: Tomasz Kamiński Date: Fri, 24 Apr 2026 11:02:22 +0000 (+0200) Subject: libstdc++: Reject using views::iota on iota_view. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a00a26364360c8db8c06fffee86a4c722531f19;p=thirdparty%2Fgcc.git libstdc++: Reject using views::iota on iota_view. 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> is ill-formed in this case (iota_view is not weakly_incrementable), using that type in return type explicitly, removes the overload from overload resolution in this case. The (now redudant) __detail::__can_iota_view constrain in template head is preserved, to provide error messages consistent with adaptors for other non-incrementable types. libstdc++-v3/ChangeLog: * include/std/ranges (_Iota::operator()(_Tp&&)): Replace auto return type and CTAD with iota_view>. * testsuite/std/ranges/iota/iota_view.cc: Tests if views::iota(iota_view) is rejected. Reviewed-by: Jonathan Wakely Signed-off-by: Tomasz Kamiński --- 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> operator() [[nodiscard]] (_Tp&& __e) const - { return iota_view(std::forward<_Tp>(__e)); } + { return iota_view>(std::forward<_Tp>(__e)); } template 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 #include +template +concept can_iota = requires (Inc&& __inc) +{ std::views::iota(__inc); }; + +static_assert( can_iota ); +static_assert( can_iota ); +static_assert( !can_iota> ); +static_assert( !can_iota> ); +static_assert( !can_iota&> ); +static_assert( !can_iota&> ); + void test01() {