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

Reply via email to