summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/ranges/range.access/end.pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/std/ranges/range.access/end.pass.cpp')
-rw-r--r--libcxx/test/std/ranges/range.access/end.pass.cpp123
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; }