@@ -36,9 +36,45 @@ struct DataMember {
36
36
int x;
37
37
constexpr const int *data () const { return &x; }
38
38
};
39
-
40
39
static_assert ( std::is_invocable_v<RangeDataT, DataMember &>);
41
40
static_assert (!std::is_invocable_v<RangeDataT, DataMember &&>);
41
+ static_assert ( std::is_invocable_v<RangeDataT, DataMember const &>);
42
+ static_assert (!std::is_invocable_v<RangeDataT, DataMember const &&>);
43
+
44
+ constexpr bool testReturnTypes () {
45
+ {
46
+ int *x[2 ];
47
+ ASSERT_SAME_TYPE (decltype (std::ranges::data (x)), int **);
48
+ }
49
+ {
50
+ int x[2 ][2 ];
51
+ ASSERT_SAME_TYPE (decltype (std::ranges::data (x)), int (*)[2 ]);
52
+ }
53
+ {
54
+ struct D {
55
+ char *& data ();
56
+ short *& data () const ;
57
+ };
58
+ ASSERT_SAME_TYPE (decltype (std::ranges::data (std::declval<D&>())), char *);
59
+ static_assert (!std::is_invocable_v<RangeDataT, D&&>);
60
+ ASSERT_SAME_TYPE (decltype (std::ranges::data (std::declval<const D&>())), short *);
61
+ static_assert (!std::is_invocable_v<RangeDataT, const D&&>);
62
+ }
63
+ {
64
+ struct NC {
65
+ char *begin () const ;
66
+ char *end () const ;
67
+ int *data ();
68
+ };
69
+ static_assert (!std::ranges::contiguous_range<NC>);
70
+ static_assert ( std::ranges::contiguous_range<const NC>);
71
+ ASSERT_SAME_TYPE (decltype (std::ranges::data (std::declval<NC&>())), int *);
72
+ static_assert (!std::is_invocable_v<RangeDataT, NC&&>);
73
+ ASSERT_SAME_TYPE (decltype (std::ranges::data (std::declval<const NC&>())), char *);
74
+ static_assert (!std::is_invocable_v<RangeDataT, const NC&&>);
75
+ }
76
+ return true ;
77
+ }
42
78
43
79
struct VoidDataMember {
44
80
void *data () const ;
@@ -49,21 +85,14 @@ struct Empty { };
49
85
struct EmptyDataMember {
50
86
Empty data () const ;
51
87
};
52
-
53
88
static_assert (!std::is_invocable_v<RangeDataT, EmptyDataMember const &>);
54
89
55
- struct EmptyPtrDataMember {
56
- Empty x;
57
- constexpr const Empty *data () const { return &x; }
58
- };
59
-
60
- struct PtrConvertible {
61
- operator int *() const ;
62
- };
63
90
struct PtrConvertibleDataMember {
64
- PtrConvertible data () const ;
91
+ struct Ptr {
92
+ operator int *() const ;
93
+ };
94
+ Ptr data () const ;
65
95
};
66
-
67
96
static_assert (!std::is_invocable_v<RangeDataT, PtrConvertibleDataMember const &>);
68
97
69
98
struct NonConstDataMember {
@@ -74,14 +103,13 @@ struct NonConstDataMember {
74
103
struct EnabledBorrowingDataMember {
75
104
constexpr int *data () { return &globalBuff[0 ]; }
76
105
};
77
-
78
106
template <>
79
107
inline constexpr bool std::ranges::enable_borrowed_range<EnabledBorrowingDataMember> = true ;
80
108
81
109
struct DataMemberAndBegin {
82
110
int x;
83
111
constexpr const int *data () const { return &x; }
84
- constexpr const int *begin () const { return &x; }
112
+ const int *begin () const ;
85
113
};
86
114
87
115
constexpr bool testDataMember () {
@@ -147,8 +175,10 @@ struct BeginMemberRvalue {
147
175
148
176
ContiguousIter begin () &&;
149
177
};
178
+ static_assert (!std::is_invocable_v<RangeDataT, BeginMemberRvalue&>);
150
179
static_assert (!std::is_invocable_v<RangeDataT, BeginMemberRvalue&&>);
151
180
static_assert (!std::is_invocable_v<RangeDataT, BeginMemberRvalue const &>);
181
+ static_assert (!std::is_invocable_v<RangeDataT, BeginMemberRvalue const &&>);
152
182
153
183
struct BeginMemberBorrowingEnabled {
154
184
constexpr contiguous_iterator<int *> begin () { return contiguous_iterator<int *>{&globalBuff[1 ]}; }
@@ -188,6 +218,8 @@ struct RandomButNotContiguous {
188
218
static_assert (!std::is_invocable_v<RangeDataT, RandomButNotContiguous>);
189
219
190
220
int main (int , char **) {
221
+ static_assert (testReturnTypes ());
222
+
191
223
testDataMember ();
192
224
static_assert (testDataMember ());
193
225
0 commit comments