https://gcc.gnu.org/g:c7449f1b1511abbee1c6b060090eda4d2d6b1879
commit r15-7844-gc7449f1b1511abbee1c6b060090eda4d2d6b1879 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Mar 5 18:06:25 2025 +0000 libstdc++: Make enumerate_view::iterator::operator- noexcept Implement LWG 3912, approved in Varna, June 2023. libstdc++-v3/ChangeLog: * include/std/ranges (enumerate_view::_Iterator::operator-): Add noexcept, as per LWG 3912. * testsuite/std/ranges/adaptors/enumerate/1.cc: Check iterator difference is noexcept. Diff: --- libstdc++-v3/include/std/ranges | 2 +- libstdc++-v3/testsuite/std/ranges/adaptors/enumerate/1.cc | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 6790fcf7af19..e21f5284b46d 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -9176,7 +9176,7 @@ namespace views::__adaptor { return auto(__x) -= __y; } friend constexpr difference_type - operator-(const _Iterator& __x, const _Iterator& __y) + operator-(const _Iterator& __x, const _Iterator& __y) noexcept { return __x._M_pos - __y._M_pos; } friend constexpr auto diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/enumerate/1.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/enumerate/1.cc index c33aa9ff51e1..19aa98284d08 100644 --- a/libstdc++-v3/testsuite/std/ranges/adaptors/enumerate/1.cc +++ b/libstdc++-v3/testsuite/std/ranges/adaptors/enumerate/1.cc @@ -91,6 +91,17 @@ test02() } } +void +test_lwg3912() +{ + int x[] = {1, 2, 3}; + test_input_range<int> rx (x); + auto v = rx | views::enumerate; + auto iter = std::ranges::begin(v); + // LWG 3912. enumerate_view::iterator::operator- should be noexcept + static_assert( noexcept(iter - iter) ); +} + int main() {