diff options
Diffstat (limited to 'libcxx/test/std/ranges/range.access/end.pass.cpp')
-rw-r--r-- | libcxx/test/std/ranges/range.access/end.pass.cpp | 123 |
1 files changed, 59 insertions, 64 deletions
diff --git a/libcxx/test/std/ranges/range.access/end.pass.cpp b/libcxx/test/std/ranges/range.access/end.pass.cpp index 5f4f05279cdd..ad01b4a16ac7 100644 --- 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 <ranges> #include <cassert> +#include <utility> #include "test_macros.h" #include "test_iterators.h" @@ -28,6 +29,10 @@ static_assert(!std::is_invocable_v<RangeEndT, int (&&)[]>); static_assert(!std::is_invocable_v<RangeEndT, int (&)[]>); static_assert(!std::is_invocable_v<RangeEndT, int (&&)[10]>); static_assert( std::is_invocable_v<RangeEndT, int (&)[10]>); +static_assert(!std::is_invocable_v<RangeCEndT, int (&&)[]>); +static_assert(!std::is_invocable_v<RangeCEndT, int (&)[]>); +static_assert(!std::is_invocable_v<RangeCEndT, int (&&)[10]>); +static_assert( std::is_invocable_v<RangeCEndT, int (&)[10]>); struct Incomplete; static_assert(!std::is_invocable_v<RangeEndT, Incomplete(&&)[]>); @@ -91,40 +96,18 @@ constexpr bool testArray() { 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<RangeEndT, EndMemberReturnsInt const&>); struct EndMemberReturnsVoidPtr { const void *begin() const; const void *end() const; }; - static_assert(!std::is_invocable_v<RangeEndT, EndMemberReturnsVoidPtr const&>); -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<RangeEndT, EmptyEndMember const&>); - struct PtrConvertible { operator int*() const; }; @@ -132,13 +115,11 @@ struct PtrConvertibleEndMember { PtrConvertible begin() const; PtrConvertible end() const; }; - static_assert(!std::is_invocable_v<RangeEndT, PtrConvertibleEndMember const&>); struct NoBeginMember { constexpr const int *end(); }; - static_assert(!std::is_invocable_v<RangeEndT, NoBeginMember const&>); struct NonConstEndMember { @@ -146,7 +127,6 @@ struct NonConstEndMember { constexpr int *begin() { return nullptr; } constexpr int *end() { return &x; } }; - static_assert( std::is_invocable_v<RangeEndT, NonConstEndMember &>); static_assert(!std::is_invocable_v<RangeEndT, NonConstEndMember const&>); static_assert(!std::is_invocable_v<RangeCEndT, NonConstEndMember &>); @@ -160,6 +140,26 @@ struct EnabledBorrowingEndMember { template<> inline constexpr bool std::ranges::enable_borrowed_range<EnabledBorrowingEndMember> = 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<RangeEndT, EmptyEndMember const&>); + +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<RangeEndT, EndFunction &>); static_assert( std::is_invocable_v<RangeCEndT, EndFunction const&>); static_assert( std::is_invocable_v<RangeCEndT, EndFunction &>); -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<RangeCEndT, EndFunctionByValue>); - -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<EndFunctionEnabledBorrowing> = true; - struct EndFunctionReturnsInt { friend constexpr int begin(EndFunctionReturnsInt const&); friend constexpr int end(EndFunctionReturnsInt const&); }; - static_assert(!std::is_invocable_v<RangeEndT, EndFunctionReturnsInt const&>); struct EndFunctionReturnsVoidPtr { friend constexpr void *begin(EndFunctionReturnsVoidPtr const&); friend constexpr void *end(EndFunctionReturnsVoidPtr const&); }; - static_assert(!std::is_invocable_v<RangeEndT, EndFunctionReturnsVoidPtr const&>); struct EndFunctionReturnsEmpty { friend constexpr Empty begin(EndFunctionReturnsEmpty const&); friend constexpr Empty end(EndFunctionReturnsEmpty const&); }; - static_assert(!std::is_invocable_v<RangeEndT, EndFunctionReturnsEmpty const&>); struct EndFunctionReturnsPtrConvertible { friend constexpr PtrConvertible begin(EndFunctionReturnsPtrConvertible const&); friend constexpr PtrConvertible end(EndFunctionReturnsPtrConvertible const&); }; - static_assert(!std::is_invocable_v<RangeEndT, EndFunctionReturnsPtrConvertible const&>); struct NoBeginFunction { friend constexpr const int *end(NoBeginFunction const&); }; - static_assert(!std::is_invocable_v<RangeEndT, NoBeginFunction const&>); +struct EndFunctionByValue { + friend constexpr int *begin(EndFunctionByValue) { return nullptr; } + friend constexpr int *end(EndFunctionByValue) { return &globalBuff[1]; } +}; +static_assert(!std::is_invocable_v<RangeCEndT, EndFunctionByValue>); + +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<EndFunctionEnabledBorrowing> = 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; } |