Hi Jonathan, On Tue, Oct 14, 2025 at 10:55 PM Jonathan Wakely <[email protected]> wrote: > Attaching patches as application/octet-stream makes them hard to > review and comment inline. If possible using 'git send-email' is the > ideal way to submit patches. If that's not possible (it can be awkward > to set up to send via gmail) then attaching a .txt file as text/plain > makes things easier for reviewers. >
I'm attaching it as a txt file now; hopefully, this works. > Putting the [[nodiscard]] attribute after operator() was necessary in > previous releases of GCC due to -fconcepts-ts compatibility, but > that's no longer relevant for GCC 16. You can just put [[nodiscard]] > before the return type. > Done. > If you're contributing under the DCO terms then please don't add the > FSF copyright notice to new tests. And the test is not very novel or > interesting, so the licence text isn't needed either, see > https://gcc.gnu.org/onlinedocs/libstdc++/manual/test.html#test.new_tests > Thanks for the guidance. I've removed the copyright now. > > Also, I think this can be unconditionally noexcept. We know that > constructing iota_view from an integer-like type will not throw. > > For an arbitrary program-defined type that models weakly_incrementable > it could throw, but not for integer-like types. > Done. Thanks for the prompt review! Yuao
From 275098e5dff81fc5e062b021305a7a55410f9028 Mon Sep 17 00:00:00 2001 From: Yuao Ma <[email protected]> Date: Tue, 14 Oct 2025 23:10:23 +0800 Subject: [PATCH] libstdc++: Implement P3060R3: Add std::views::indices(n) This patch adds the views::indices function using iota. libstdc++-v3/ChangeLog: * include/bits/version.def: Add ranges_indices FTM. * include/bits/version.h: Regenerate. * include/std/ranges: Implement views::indices. * testsuite/std/ranges/indices/1.cc: New test. --- libstdc++-v3/include/bits/version.def | 8 ++++ libstdc++-v3/include/bits/version.h | 10 +++++ libstdc++-v3/include/std/ranges | 13 +++++++ .../testsuite/std/ranges/indices/1.cc | 39 +++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 libstdc++-v3/testsuite/std/ranges/indices/1.cc diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index 1118da4b541..80cfea39fb3 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1754,6 +1754,14 @@ ftms = { }; }; +ftms = { + name = ranges_indices; + values = { + v = 202506; + cxxmin = 26; + }; +}; + ftms = { name = constexpr_bitset; values = { diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index c452bbeec8e..07a8ecabb6e 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -1956,6 +1956,16 @@ #endif /* !defined(__cpp_lib_ranges_starts_ends_with) */ #undef __glibcxx_want_ranges_starts_ends_with +#if !defined(__cpp_lib_ranges_indices) +# if (__cplusplus > 202302L) +# define __glibcxx_ranges_indices 202506L +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_ranges_indices) +# define __cpp_lib_ranges_indices 202506L +# endif +# endif +#endif /* !defined(__cpp_lib_ranges_indices) */ +#undef __glibcxx_want_ranges_indices + #if !defined(__cpp_lib_constexpr_bitset) # if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED && (__cpp_constexpr_dynamic_alloc) # define __glibcxx_constexpr_bitset 202202L diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index fd290ea362c..ec31df41f40 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -65,6 +65,7 @@ #define __glibcxx_want_ranges_chunk #define __glibcxx_want_ranges_chunk_by #define __glibcxx_want_ranges_enumerate +#define __glibcxx_want_ranges_indices #define __glibcxx_want_ranges_join_with #define __glibcxx_want_ranges_repeat #define __glibcxx_want_ranges_slide @@ -785,6 +786,18 @@ namespace views }; inline constexpr _Iota iota{}; + +#ifdef __cpp_lib_ranges_indices // C++ >= 26 + struct _Indices + { + template<ranges::__detail::__is_integer_like _Tp> + [[nodiscard]] constexpr auto + operator() (_Tp&& __e) const noexcept + { return iota(_Tp{}, __e); } + }; + + inline constexpr _Indices indices{}; +#endif // __cpp_lib_ranges_indices } // namespace views #if _GLIBCXX_HOSTED diff --git a/libstdc++-v3/testsuite/std/ranges/indices/1.cc b/libstdc++-v3/testsuite/std/ranges/indices/1.cc new file mode 100644 index 00000000000..8d4ae2775fb --- /dev/null +++ b/libstdc++-v3/testsuite/std/ranges/indices/1.cc @@ -0,0 +1,39 @@ +// { dg-do run { target c++26 } } + +#include <ranges> +#include <vector> + +#include <testsuite_hooks.h> + +constexpr bool test() { + { + auto indices_view = std::ranges::views::indices(4); + static_assert(std::ranges::range<decltype(indices_view)>); + + VERIFY(indices_view.size() == 4); + VERIFY(indices_view[0] == 0); + VERIFY(indices_view[1] == 1); + VERIFY(indices_view[2] == 2); + VERIFY(indices_view[3] == 3); + } + + { + std::vector v(4, 0); + + auto indices_view = std::ranges::views::indices(std::ranges::size(v)); + static_assert(std::ranges::range<decltype(indices_view)>); + + VERIFY(indices_view.size() == 4); + VERIFY(indices_view[0] == 0); + VERIFY(indices_view[1] == 1); + VERIFY(indices_view[2] == 2); + VERIFY(indices_view[3] == 3); + } + + return true; +} + +int main() { + VERIFY(test()); + static_assert(test()); +} -- 2.43.0
