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()
 {

Reply via email to