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