diff --git a/libcxx/include/__ranges/access.h b/libcxx/include/__ranges/access.h --- a/libcxx/include/__ranges/access.h +++ b/libcxx/include/__ranges/access.h @@ -14,7 +14,6 @@ #include <__iterator/concepts.h> #include <__iterator/readable_traits.h> #include <__ranges/enable_borrowed_range.h> -#include <__utility/as_const.h> #include <__utility/auto_cast.h> #include #include diff --git a/libcxx/test/std/ranges/range.access/begin.pass.cpp b/libcxx/test/std/ranges/range.access/begin.pass.cpp --- a/libcxx/test/std/ranges/range.access/begin.pass.cpp +++ b/libcxx/test/std/ranges/range.access/begin.pass.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "test_macros.h" #include "test_iterators.h" @@ -28,6 +29,10 @@ static_assert( std::is_invocable_v); static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); +static_assert(!std::is_invocable_v); +static_assert( std::is_invocable_v); +static_assert(!std::is_invocable_v); +static_assert( std::is_invocable_v); struct Incomplete; static_assert(!std::is_invocable_v); @@ -105,12 +110,6 @@ return true; } -struct BeginMemberFunction { - int x; - constexpr const int *begin() const { return &x; } - friend int *begin(BeginMemberFunction const&); -}; - struct BeginMemberReturnsInt { int begin() const; }; @@ -127,12 +126,6 @@ }; static_assert(!std::is_invocable_v); -struct EmptyPtrBeginMember { - struct Empty {}; - Empty x; - constexpr const Empty *begin() const { return &x; } -}; - struct PtrConvertibleBeginMember { struct iterator { operator int*() const; }; iterator begin() const; @@ -154,6 +147,18 @@ template<> inline constexpr bool std::ranges::enable_borrowed_range = true; +struct BeginMemberFunction { + int x; + constexpr const int *begin() const { return &x; } + friend int *begin(BeginMemberFunction const&); +}; + +struct EmptyPtrBeginMember { + struct Empty {}; + Empty x; + constexpr const Empty *begin() const { return &x; } +}; + constexpr bool testBeginMember() { BeginMember a; assert(std::ranges::begin(a) == &a.x); @@ -193,24 +198,21 @@ static_assert( std::is_invocable_v); static_assert( std::is_invocable_v); -struct BeginFunctionWithDataMember { - int x; - int begin; - friend constexpr const int *begin(BeginFunctionWithDataMember const& bf) { return &bf.x; } +struct BeginFunctionReturnsInt { + friend int begin(BeginFunctionReturnsInt const&); }; +static_assert(!std::is_invocable_v); -struct BeginFunctionWithPrivateBeginMember { - int y; - friend constexpr const int *begin(BeginFunctionWithPrivateBeginMember const& bf) { return &bf.y; } -private: - const int *begin() const; +struct BeginFunctionReturnsVoidPtr { + friend void *begin(BeginFunctionReturnsVoidPtr const&); }; +static_assert(!std::is_invocable_v); -struct BeginFunctionReturnsEmptyPtr { - struct Empty {}; - Empty x; - friend constexpr const Empty *begin(BeginFunctionReturnsEmptyPtr const& bf) { return &bf.x; } +struct BeginFunctionReturnsPtrConvertible { + struct iterator { operator int*() const; }; + friend iterator begin(BeginFunctionReturnsPtrConvertible const&); }; +static_assert(!std::is_invocable_v); struct BeginFunctionByValue { friend constexpr int *begin(BeginFunctionByValue) { return &globalBuff[1]; } @@ -223,27 +225,24 @@ template<> inline constexpr bool std::ranges::enable_borrowed_range = true; -struct BeginFunctionReturnsInt { - friend int begin(BeginFunctionReturnsInt const&); -}; -static_assert(!std::is_invocable_v); - -struct BeginFunctionReturnsVoidPtr { - friend void *begin(BeginFunctionReturnsVoidPtr const&); +struct BeginFunctionReturnsEmptyPtr { + struct Empty {}; + Empty x; + friend constexpr const Empty *begin(BeginFunctionReturnsEmptyPtr const& bf) { return &bf.x; } }; -static_assert(!std::is_invocable_v); -struct BeginFunctionReturnsEmpty { - struct Empty {}; - friend Empty begin(BeginFunctionReturnsEmpty const&); +struct BeginFunctionWithDataMember { + int x; + int begin; + friend constexpr const int *begin(BeginFunctionWithDataMember const& bf) { return &bf.x; } }; -static_assert(!std::is_invocable_v); -struct BeginFunctionReturnsPtrConvertible { - struct iterator { operator int*() const; }; - friend iterator begin(BeginFunctionReturnsPtrConvertible const&); +struct BeginFunctionWithPrivateBeginMember { + int y; + friend constexpr const int *begin(BeginFunctionWithPrivateBeginMember const& bf) { return &bf.y; } +private: + const int *begin() const; }; -static_assert(!std::is_invocable_v); constexpr bool testBeginFunction() { BeginFunction a{}; diff --git a/libcxx/test/std/ranges/range.access/end.pass.cpp b/libcxx/test/std/ranges/range.access/end.pass.cpp --- a/libcxx/test/std/ranges/range.access/end.pass.cpp +++ b/libcxx/test/std/ranges/range.access/end.pass.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "test_macros.h" #include "test_iterators.h" @@ -28,6 +29,10 @@ static_assert(!std::is_invocable_v); static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); +static_assert(!std::is_invocable_v); +static_assert(!std::is_invocable_v); +static_assert(!std::is_invocable_v); +static_assert( std::is_invocable_v); struct Incomplete; static_assert(!std::is_invocable_v); @@ -91,40 +96,18 @@ return true; } -struct EndMemberFunction { - int x; - constexpr const int *begin() const { return nullptr; } - constexpr const int *end() const { return &x; } - friend constexpr int *end(EndMemberFunction const&); -}; - struct EndMemberReturnsInt { int begin() const; int end() const; }; - static_assert(!std::is_invocable_v); struct EndMemberReturnsVoidPtr { const void *begin() const; const void *end() const; }; - static_assert(!std::is_invocable_v); -struct Empty { }; -struct EmptyEndMember { - Empty begin() const; - Empty end() const; -}; -struct EmptyPtrEndMember { - Empty x; - constexpr const Empty *begin() const { return nullptr; } - constexpr const Empty *end() const { return &x; } -}; - -static_assert(!std::is_invocable_v); - struct PtrConvertible { operator int*() const; }; @@ -132,13 +115,11 @@ PtrConvertible begin() const; PtrConvertible end() const; }; - static_assert(!std::is_invocable_v); struct NoBeginMember { constexpr const int *end(); }; - static_assert(!std::is_invocable_v); struct NonConstEndMember { @@ -146,7 +127,6 @@ constexpr int *begin() { return nullptr; } constexpr int *end() { return &x; } }; - static_assert( std::is_invocable_v); static_assert(!std::is_invocable_v); static_assert(!std::is_invocable_v); @@ -160,6 +140,26 @@ template<> inline constexpr bool std::ranges::enable_borrowed_range = true; +struct EndMemberFunction { + int x; + constexpr const int *begin() const { return nullptr; } + constexpr const int *end() const { return &x; } + friend constexpr int *end(EndMemberFunction const&); +}; + +struct Empty { }; +struct EmptyEndMember { + Empty begin() const; + Empty end() const; +}; +static_assert(!std::is_invocable_v); + +struct EmptyPtrEndMember { + Empty x; + constexpr const Empty *begin() const { return nullptr; } + constexpr const Empty *end() const { return &x; } +}; + constexpr bool testEndMember() { EndMember a; assert(std::ranges::end(a) == &a.x); @@ -199,74 +199,69 @@ static_assert( std::is_invocable_v); static_assert( std::is_invocable_v); -struct EndFunctionWithDataMember { - int x; - int end; - friend constexpr const int *begin(EndFunctionWithDataMember const&) { return nullptr; } - friend constexpr const int *end(EndFunctionWithDataMember const& bf) { return &bf.x; } -}; - -struct EndFunctionWithPrivateEndMember : private EndMember { - int y; - friend constexpr const int *begin(EndFunctionWithPrivateEndMember const&) { return nullptr; } - friend constexpr const int *end(EndFunctionWithPrivateEndMember const& bf) { return &bf.y; } -}; - -struct EndFunctionReturnsEmptyPtr { - Empty x; - friend constexpr const Empty *begin(EndFunctionReturnsEmptyPtr const&) { return nullptr; } - friend constexpr const Empty *end(EndFunctionReturnsEmptyPtr const& bf) { return &bf.x; } -}; - -struct EndFunctionByValue { - friend constexpr int *begin(EndFunctionByValue) { return nullptr; } - friend constexpr int *end(EndFunctionByValue) { return &globalBuff[1]; } -}; - -static_assert(!std::is_invocable_v); - -struct EndFunctionEnabledBorrowing { - friend constexpr int *begin(EndFunctionEnabledBorrowing) { return nullptr; } - friend constexpr int *end(EndFunctionEnabledBorrowing) { return &globalBuff[2]; } -}; - -template<> -inline constexpr bool std::ranges::enable_borrowed_range = true; - struct EndFunctionReturnsInt { friend constexpr int begin(EndFunctionReturnsInt const&); friend constexpr int end(EndFunctionReturnsInt const&); }; - static_assert(!std::is_invocable_v); struct EndFunctionReturnsVoidPtr { friend constexpr void *begin(EndFunctionReturnsVoidPtr const&); friend constexpr void *end(EndFunctionReturnsVoidPtr const&); }; - static_assert(!std::is_invocable_v); struct EndFunctionReturnsEmpty { friend constexpr Empty begin(EndFunctionReturnsEmpty const&); friend constexpr Empty end(EndFunctionReturnsEmpty const&); }; - static_assert(!std::is_invocable_v); struct EndFunctionReturnsPtrConvertible { friend constexpr PtrConvertible begin(EndFunctionReturnsPtrConvertible const&); friend constexpr PtrConvertible end(EndFunctionReturnsPtrConvertible const&); }; - static_assert(!std::is_invocable_v); struct NoBeginFunction { friend constexpr const int *end(NoBeginFunction const&); }; - static_assert(!std::is_invocable_v); +struct EndFunctionByValue { + friend constexpr int *begin(EndFunctionByValue) { return nullptr; } + friend constexpr int *end(EndFunctionByValue) { return &globalBuff[1]; } +}; +static_assert(!std::is_invocable_v); + +struct EndFunctionEnabledBorrowing { + friend constexpr int *begin(EndFunctionEnabledBorrowing) { return nullptr; } + friend constexpr int *end(EndFunctionEnabledBorrowing) { return &globalBuff[2]; } +}; +template<> +inline constexpr bool std::ranges::enable_borrowed_range = true; + +struct EndFunctionReturnsEmptyPtr { + Empty x; + friend constexpr const Empty *begin(EndFunctionReturnsEmptyPtr const&) { return nullptr; } + friend constexpr const Empty *end(EndFunctionReturnsEmptyPtr const& bf) { return &bf.x; } +}; + +struct EndFunctionWithDataMember { + int x; + int end; + friend constexpr const int *begin(EndFunctionWithDataMember const&) { return nullptr; } + friend constexpr const int *end(EndFunctionWithDataMember const& bf) { return &bf.x; } +}; + +struct EndFunctionWithPrivateEndMember { + int y; + friend constexpr const int *begin(EndFunctionWithPrivateEndMember const&) { return nullptr; } + friend constexpr const int *end(EndFunctionWithPrivateEndMember const& bf) { return &bf.y; } +private: + const int *end() const; +}; + struct BeginMemberEndFunction { int x; constexpr const int *begin() const { return nullptr; }