diff --git a/libcxx/include/__ranges/take_view.h b/libcxx/include/__ranges/take_view.h --- a/libcxx/include/__ranges/take_view.h +++ b/libcxx/include/__ranges/take_view.h @@ -226,6 +226,7 @@ }; template + requires requires{typename subrange<_Iter>;} struct __passthrough_type> { using type = subrange<_Iter>; }; diff --git a/libcxx/test/std/ranges/range.adaptors/range.take/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take/adaptor.pass.cpp --- a/libcxx/test/std/ranges/range.adaptors/range.take/adaptor.pass.cpp +++ b/libcxx/test/std/ranges/range.adaptors/range.take/adaptor.pass.cpp @@ -194,6 +194,19 @@ [[maybe_unused]] auto partial = std::views::take(X{}); } + // Test when `subrange` is not well formed + { + int input[] = {1, 2, 3}; + using Iter = cpp20_input_iterator; + using Sent = sentinel_wrapper; + std::ranges::subrange r{Iter{input}, Sent{Iter{input + 3}}}; + auto tv = std::views::take(std::move(r), 1); + auto it = tv.begin(); + assert(*it == 1); + ++it; + assert(it == tv.end()); + } + return true; }