diff --git a/stl/inc/ranges b/stl/inc/ranges index 1a435dccc76..44ccc46310c 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -8388,7 +8388,8 @@ namespace ranges { template concept _Converts_and_common_constructible = _Ref_converts<_Rng, _Container> && common_range<_Rng> // - && _Cpp17_input_iterator> // + && requires { typename iterator_traits>::iterator_category; } + && derived_from>::iterator_category, input_iterator_tag> && constructible_from<_Container, iterator_t<_Rng>, iterator_t<_Rng>, _Types...>; template diff --git a/tests/std/tests/P1206R7_ranges_to_misc/test.cpp b/tests/std/tests/P1206R7_ranges_to_misc/test.cpp index 9540c0077cc..354e365f52a 100644 --- a/tests/std/tests/P1206R7_ranges_to_misc/test.cpp +++ b/tests/std/tests/P1206R7_ranges_to_misc/test.cpp @@ -137,6 +137,27 @@ constexpr bool test_nested_range() { return true; } +struct ContainerLike { + template + constexpr ContainerLike(Iter first, Iter last) : dist(static_cast(ranges::distance(first, last))) {} + + constexpr char* begin() { + return nullptr; + } + constexpr char* end() { + return nullptr; + } + + std::ptrdiff_t dist; +}; + +constexpr bool test_lwg3733() { + auto nul_termination = std::views::take_while([](char ch) { return ch != '\0'; }); + auto c = nul_termination("1729") | std::views::common | ranges::to(); + assert(c.dist == 4); + return true; +} + constexpr bool test_lwg3785() { std::vector vec{42, 1729}; @@ -171,6 +192,9 @@ int main() { static_assert(test_nested_range()); #endif // defined(__clang__) || defined(__EDG__) + test_lwg3733(); + static_assert(test_lwg3733()); + test_lwg3785(); static_assert(test_lwg3785()); }