On Wed, Oct 22, 2025 at 4:41 AM Jonathan Wakely <[email protected]> wrote: > > On Mon, 20 Oct 2025 at 15:04, Jonathan Wakely <[email protected]> wrote: > > > > On Wed, 15 Oct 2025 at 16:23, Yuao Ma <[email protected]> wrote: > > > > > > Hi Jonathan, > > > > > > Thanks for the information about the standard wording. Regarding this > > > patch, I'm wondering does it need any further refinement? > > > > No, I don't think you need to make any changes. > > I see this was pushed to trunk - please wait for explicit approval. >
Sorry for this, will do next time. > My last mail probably wasn't very clear, but I hadn't finished a final > review. Not a big deal, since the patch is good. > > It turns out another change is needed though, because the test failure > you got with __max_size_type should be SFINAE-friendly, because > indices(1) should be expression equivalent to iota(0, 1). > Yes, it occurs to me that since I'm using iota for the implementation, I could directly use __can_iota_view as the type parameter. However, I've chosen to use the integer_like concept mentioned in the paper instead. > I'm testing this fix: > > Author: Jonathan Wakely <[email protected]> > AuthorDate: Tue Oct 21 21:21:45 2025 > Commit: Jonathan Wakely <[email protected]> > CommitDate: Tue Oct 21 21:21:45 2025 > > libstdc++: Add missing constraints to views::indices > > Calling views::indices(n) should be expression equivalent to > views::iota(decltype(n)(0), n), which means it should have the same > constraints as views::iota and be SFINAE-friendly. > > libstdc++-v3/ChangeLog: > > * include/std/ranges (indices::operator()): Constrain using > __can_iota_view concept. > * testsuite/std/ranges/indices/1.cc: Check SFINAE-friendliness > required by expression equivalence. > > diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges > index 25d2e28e72ff..158692d92a70 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -791,6 +791,7 @@ namespace views > struct _Indices > { > template<ranges::__detail::__is_integer_like _Tp> > + requires __detail::__can_iota_view<_Tp> > [[nodiscard]] constexpr auto > operator() (_Tp __e) const noexcept > { return iota(_Tp{}, __e); } > diff --git a/libstdc++-v3/testsuite/std/ranges/indices/1.cc > b/libstdc++-v3/testsuite/std/ranges/indices/1.cc > index 805b29e358f7..0b5ed3a37afc 100644 > --- a/libstdc++-v3/testsuite/std/ranges/indices/1.cc > +++ b/libstdc++-v3/testsuite/std/ranges/indices/1.cc > @@ -29,3 +29,17 @@ int main() { > VERIFY(test<size_t>(44)); > static_assert(test<size_t>(44)); > } > + > +template<typename T> > +constexpr bool test_wider(T n) > +{ > + // If indices(n) works, try again with ranges::distance(indices(n)), > + // which will be a wider type, until we get to an unsupported type. > + // This verifies that indices(n) is SFINAE-friendly, because otherwise we > + // would get a hard error outside the immediate context checked by > requires. > + if constexpr (requires { std::views::indices(n); }) > + test_wider(std::ranges::distance(std::views::indices(n))); > + return true; > +} > + > +static_assert(test_wider(0)); > Thanks for the quick fix! Yuao
