From 9bf42a9f7a686e1d31ff519a6ab875d11a5b5354 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Mon, 25 Mar 2024 00:24:07 +0800 Subject: [PATCH] Implement LWG-4012 --- stl/inc/ranges | 8 +++-- tests/std/tests/P0896R4_views_common/test.cpp | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 30d22d9c4f5..2bf24a05128 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -5285,7 +5285,9 @@ namespace ranges { } _NODISCARD constexpr auto begin() noexcept( - noexcept(_RANGES begin(_Base)) && is_nothrow_move_constructible_v>) /* strengthened */ { + noexcept(_RANGES begin(_Base)) && is_nothrow_move_constructible_v>) /* strengthened */ + requires (!_Simple_view<_Vw>) + { if constexpr (random_access_range<_Vw> && sized_range<_Vw>) { return _RANGES begin(_Base); } else { @@ -5304,7 +5306,9 @@ namespace ranges { } } - _NODISCARD constexpr auto end() { + _NODISCARD constexpr auto end() + requires (!_Simple_view<_Vw>) + { if constexpr (random_access_range<_Vw> && sized_range<_Vw>) { return _RANGES begin(_Base) + _RANGES distance(_Base); } else { diff --git a/tests/std/tests/P0896R4_views_common/test.cpp b/tests/std/tests/P0896R4_views_common/test.cpp index 04daf0fd82e..ed32cfa116a 100644 --- a/tests/std/tests/P0896R4_views_common/test.cpp +++ b/tests/std/tests/P0896R4_views_common/test.cpp @@ -541,6 +541,34 @@ constexpr bool test_lwg3717() { return true; } +constexpr bool test_lwg_4012() { + struct simple_view_with_difference_on_const : ranges::view_interface { + constexpr difference_type_only_iterator begin() noexcept { + return {nullptr}; + } + constexpr difference_type_only_sentinel end() noexcept { + return {nullptr}; + } + constexpr difference_type_only_iterator begin() const noexcept { + return {p_}; + } + constexpr difference_type_only_sentinel end() const noexcept { + return {p_}; + } + + int* p_; + }; + + int n{}; + auto cv = views::common(simple_view_with_difference_on_const{{}, &n}); + + assert(cv.begin() == as_const(cv).begin()); + assert(cv.begin() == as_const(cv).end()); + assert(as_const(cv).begin() == cv.end()); + + return true; +} + int main() { // Get full instantiation coverage static_assert((test_in(), true)); @@ -551,4 +579,7 @@ int main() { assert(test_lwg3717()); assert(test_lwg3717()); + + static_assert(test_lwg_4012()); + test_lwg_4012(); }