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. --- Tested x86_64-linux. Pushed to trunk. libstdc++-v3/include/std/ranges | 2 +- .../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 6790fcf7af1..e21f5284b46 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 c33aa9ff51e..19aa98284d0 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() { -- 2.48.1