From 8624d1e32b6766ca64694360bdcfc5b136d35286 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Mon, 9 Dec 2024 11:49:41 +0800 Subject: [PATCH 1/2] Fix regression with `ranges::to` for ADL-only `begin`/`end` --- stl/inc/__msvc_ranges_to.hpp | 6 ++++- .../std/tests/P1206R7_ranges_to_misc/test.cpp | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/stl/inc/__msvc_ranges_to.hpp b/stl/inc/__msvc_ranges_to.hpp index ef3bac4ed67..4eb1e22dc6b 100644 --- a/stl/inc/__msvc_ranges_to.hpp +++ b/stl/inc/__msvc_ranges_to.hpp @@ -1121,7 +1121,11 @@ namespace ranges { if constexpr (_Sized_and_reservable<_Rng, _Container>) { _Cont.reserve(static_cast>(_RANGES size(_Range))); } - for (auto&& _Elem : _Range) { + + auto _Iter = _RANGES begin(_Range); + auto _Sent = _RANGES end(_Range); + for (; _Iter != _Sent; ++_Iter) { + auto&& _Elem = *_Iter; using _ElemTy = decltype(_Elem); if constexpr (_Can_emplace_back<_Container, _ElemTy>) { _Cont.emplace_back(_STD forward<_ElemTy>(_Elem)); diff --git a/tests/std/tests/P1206R7_ranges_to_misc/test.cpp b/tests/std/tests/P1206R7_ranges_to_misc/test.cpp index c788206ffbe..065b8a5dd82 100644 --- a/tests/std/tests/P1206R7_ranges_to_misc/test.cpp +++ b/tests/std/tests/P1206R7_ranges_to_misc/test.cpp @@ -336,6 +336,30 @@ constexpr bool test_lwg4016() { return true; } +struct adl_only_range { + static constexpr int numbers[2]{42, 1729}; + + void begin() const = delete; + void end() const = delete; + + friend constexpr const int* begin(const adl_only_range&) { + return ranges::begin(numbers); + } + friend constexpr const int* end(const adl_only_range&) { + return ranges::end(numbers); + } +}; + +constexpr bool test_lwg4016_regression() { + using vec = restricted_vector; + + ranges::contiguous_range auto r = adl_only_range{}; + auto v = r | ranges::to(); + assert(ranges::equal(v, adl_only_range::numbers)); + + return true; +} + int main() { test_reservable(); static_assert(test_reservable()); @@ -356,4 +380,7 @@ int main() { test_lwg4016(); static_assert(test_lwg4016()); + + test_lwg4016_regression(); + static_assert(test_lwg4016_regression()); } From 0363996d424eadc014fe8544df79102e07390826 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Tue, 10 Dec 2024 19:22:34 +0800 Subject: [PATCH 2/2] Make `_Sent` `const` Co-authored-by: Hewill Kang <67143766+hewillk@users.noreply.github.com> --- stl/inc/__msvc_ranges_to.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/__msvc_ranges_to.hpp b/stl/inc/__msvc_ranges_to.hpp index 4eb1e22dc6b..f13f2026a05 100644 --- a/stl/inc/__msvc_ranges_to.hpp +++ b/stl/inc/__msvc_ranges_to.hpp @@ -1122,8 +1122,8 @@ namespace ranges { _Cont.reserve(static_cast>(_RANGES size(_Range))); } - auto _Iter = _RANGES begin(_Range); - auto _Sent = _RANGES end(_Range); + auto _Iter = _RANGES begin(_Range); + const auto _Sent = _RANGES end(_Range); for (; _Iter != _Sent; ++_Iter) { auto&& _Elem = *_Iter; using _ElemTy = decltype(_Elem);