16842f52aSArthur O'Dwyer //===----------------------------------------------------------------------===//
26842f52aSArthur O'Dwyer //
36842f52aSArthur O'Dwyer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46842f52aSArthur O'Dwyer // See https://llvm.org/LICENSE.txt for license information.
56842f52aSArthur O'Dwyer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66842f52aSArthur O'Dwyer //
76842f52aSArthur O'Dwyer //===----------------------------------------------------------------------===//
86842f52aSArthur O'Dwyer
96842f52aSArthur O'Dwyer // UNSUPPORTED: c++03, c++11, c++14, c++17
106842f52aSArthur O'Dwyer
116842f52aSArthur O'Dwyer // std::ranges::data
126842f52aSArthur O'Dwyer
136842f52aSArthur O'Dwyer #include <ranges>
146842f52aSArthur O'Dwyer
156842f52aSArthur O'Dwyer #include <cassert>
161716c36dSArthur O'Dwyer #include <type_traits>
176842f52aSArthur O'Dwyer #include "test_macros.h"
186842f52aSArthur O'Dwyer #include "test_iterators.h"
196842f52aSArthur O'Dwyer
206842f52aSArthur O'Dwyer using RangeDataT = decltype(std::ranges::data);
21*483f7f55SArthur O'Dwyer using RangeCDataT = decltype(std::ranges::cdata);
226842f52aSArthur O'Dwyer
236842f52aSArthur O'Dwyer static int globalBuff[2];
246842f52aSArthur O'Dwyer
256842f52aSArthur O'Dwyer struct Incomplete;
266842f52aSArthur O'Dwyer
276842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, Incomplete[]>);
285a3c2763SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, Incomplete(&&)[2]>);
295a3c2763SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, Incomplete(&&)[2][2]>);
306842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, int [1]>);
316842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, int (&&)[1]>);
326842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, int (&)[1]>);
336842f52aSArthur O'Dwyer
34*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, Incomplete[]>);
35*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, Incomplete(&&)[2]>);
36*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, Incomplete(&&)[2][2]>);
37*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, int [1]>);
38*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, int (&&)[1]>);
39*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, int (&)[1]>);
40*483f7f55SArthur O'Dwyer
416842f52aSArthur O'Dwyer struct DataMember {
426842f52aSArthur O'Dwyer int x;
dataDataMember436842f52aSArthur O'Dwyer constexpr const int *data() const { return &x; }
446842f52aSArthur O'Dwyer };
456842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, DataMember &>);
466842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, DataMember &&>);
474163f61fSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, DataMember const&>);
484163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, DataMember const&&>);
49*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, DataMember &>);
50*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, DataMember &&>);
51*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, DataMember const&>);
52*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, DataMember const&&>);
534163f61fSArthur O'Dwyer
testReturnTypes()544163f61fSArthur O'Dwyer constexpr bool testReturnTypes() {
554163f61fSArthur O'Dwyer {
564163f61fSArthur O'Dwyer int *x[2];
574163f61fSArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::data(x)), int**);
58*483f7f55SArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::cdata(x)), int* const*);
594163f61fSArthur O'Dwyer }
604163f61fSArthur O'Dwyer {
614163f61fSArthur O'Dwyer int x[2][2];
624163f61fSArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::data(x)), int(*)[2]);
63*483f7f55SArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::cdata(x)), const int(*)[2]);
644163f61fSArthur O'Dwyer }
654163f61fSArthur O'Dwyer {
664163f61fSArthur O'Dwyer struct D {
674163f61fSArthur O'Dwyer char*& data();
684163f61fSArthur O'Dwyer short*& data() const;
694163f61fSArthur O'Dwyer };
704163f61fSArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::data(std::declval<D&>())), char*);
714163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, D&&>);
724163f61fSArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::data(std::declval<const D&>())), short*);
734163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, const D&&>);
74*483f7f55SArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::cdata(std::declval<D&>())), short*);
75*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, D&&>);
76*483f7f55SArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::cdata(std::declval<const D&>())), short*);
77*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, const D&&>);
784163f61fSArthur O'Dwyer }
794163f61fSArthur O'Dwyer {
804163f61fSArthur O'Dwyer struct NC {
814163f61fSArthur O'Dwyer char *begin() const;
824163f61fSArthur O'Dwyer char *end() const;
834163f61fSArthur O'Dwyer int *data();
844163f61fSArthur O'Dwyer };
854163f61fSArthur O'Dwyer static_assert(!std::ranges::contiguous_range<NC>);
864163f61fSArthur O'Dwyer static_assert( std::ranges::contiguous_range<const NC>);
874163f61fSArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::data(std::declval<NC&>())), int*);
884163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, NC&&>);
894163f61fSArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::data(std::declval<const NC&>())), char*);
904163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, const NC&&>);
91*483f7f55SArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::cdata(std::declval<NC&>())), char*);
92*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, NC&&>);
93*483f7f55SArthur O'Dwyer ASSERT_SAME_TYPE(decltype(std::ranges::cdata(std::declval<const NC&>())), char*);
94*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, const NC&&>);
954163f61fSArthur O'Dwyer }
964163f61fSArthur O'Dwyer return true;
974163f61fSArthur O'Dwyer }
986842f52aSArthur O'Dwyer
996842f52aSArthur O'Dwyer struct VoidDataMember {
1006842f52aSArthur O'Dwyer void *data() const;
1016842f52aSArthur O'Dwyer };
1026842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, VoidDataMember const&>);
103*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, VoidDataMember const&>);
1046842f52aSArthur O'Dwyer
1056842f52aSArthur O'Dwyer struct Empty { };
1066842f52aSArthur O'Dwyer struct EmptyDataMember {
1076842f52aSArthur O'Dwyer Empty data() const;
1086842f52aSArthur O'Dwyer };
1096842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, EmptyDataMember const&>);
110*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, EmptyDataMember const&>);
1116842f52aSArthur O'Dwyer
1124163f61fSArthur O'Dwyer struct PtrConvertibleDataMember {
1134163f61fSArthur O'Dwyer struct Ptr {
1146842f52aSArthur O'Dwyer operator int*() const;
1156842f52aSArthur O'Dwyer };
1164163f61fSArthur O'Dwyer Ptr data() const;
1176842f52aSArthur O'Dwyer };
1186842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, PtrConvertibleDataMember const&>);
119*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, PtrConvertibleDataMember const&>);
1206842f52aSArthur O'Dwyer
1216842f52aSArthur O'Dwyer struct NonConstDataMember {
1226842f52aSArthur O'Dwyer int x;
dataNonConstDataMember1236842f52aSArthur O'Dwyer constexpr int *data() { return &x; }
1246842f52aSArthur O'Dwyer };
1256842f52aSArthur O'Dwyer
1266842f52aSArthur O'Dwyer struct EnabledBorrowingDataMember {
dataEnabledBorrowingDataMember1276842f52aSArthur O'Dwyer constexpr int *data() { return &globalBuff[0]; }
1286842f52aSArthur O'Dwyer };
1296842f52aSArthur O'Dwyer template<>
1306842f52aSArthur O'Dwyer inline constexpr bool std::ranges::enable_borrowed_range<EnabledBorrowingDataMember> = true;
1316842f52aSArthur O'Dwyer
1326842f52aSArthur O'Dwyer struct DataMemberAndBegin {
1336842f52aSArthur O'Dwyer int x;
dataDataMemberAndBegin1346842f52aSArthur O'Dwyer constexpr const int *data() const { return &x; }
1354163f61fSArthur O'Dwyer const int *begin() const;
1366842f52aSArthur O'Dwyer };
1376842f52aSArthur O'Dwyer
testDataMember()1386842f52aSArthur O'Dwyer constexpr bool testDataMember() {
1396842f52aSArthur O'Dwyer DataMember a;
1406842f52aSArthur O'Dwyer assert(std::ranges::data(a) == &a.x);
141*483f7f55SArthur O'Dwyer assert(std::ranges::cdata(a) == &a.x);
1426842f52aSArthur O'Dwyer
1436842f52aSArthur O'Dwyer NonConstDataMember b;
1446842f52aSArthur O'Dwyer assert(std::ranges::data(b) == &b.x);
145*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, decltype((b))>);
1466842f52aSArthur O'Dwyer
1476842f52aSArthur O'Dwyer EnabledBorrowingDataMember c;
1486842f52aSArthur O'Dwyer assert(std::ranges::data(std::move(c)) == &globalBuff[0]);
149*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, decltype(std::move(c))>);
1506842f52aSArthur O'Dwyer
1516842f52aSArthur O'Dwyer DataMemberAndBegin d;
1526842f52aSArthur O'Dwyer assert(std::ranges::data(d) == &d.x);
153*483f7f55SArthur O'Dwyer assert(std::ranges::cdata(d) == &d.x);
1546842f52aSArthur O'Dwyer
1556842f52aSArthur O'Dwyer return true;
1566842f52aSArthur O'Dwyer }
1576842f52aSArthur O'Dwyer
1586842f52aSArthur O'Dwyer using ContiguousIter = contiguous_iterator<const int*>;
1596842f52aSArthur O'Dwyer
1606842f52aSArthur O'Dwyer struct BeginMemberContiguousIterator {
1616842f52aSArthur O'Dwyer int buff[8];
1626842f52aSArthur O'Dwyer
beginBeginMemberContiguousIterator1636842f52aSArthur O'Dwyer constexpr ContiguousIter begin() const { return ContiguousIter(buff); }
1646842f52aSArthur O'Dwyer };
1656842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator &>);
1666842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator &&>);
1676842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator const&>);
1686842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator const&&>);
169*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator &>);
170*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator &&>);
171*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator const&>);
172*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator const&&>);
1736842f52aSArthur O'Dwyer
1746842f52aSArthur O'Dwyer struct BeginMemberRandomAccess {
1756842f52aSArthur O'Dwyer int buff[8];
1766842f52aSArthur O'Dwyer
1776842f52aSArthur O'Dwyer random_access_iterator<const int*> begin() const;
1786842f52aSArthur O'Dwyer };
1791716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberRandomAccess&>);
1801716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberRandomAccess&&>);
1811716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, const BeginMemberRandomAccess&>);
1821716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, const BeginMemberRandomAccess&&>);
183*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberRandomAccess&>);
184*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberRandomAccess&&>);
185*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, const BeginMemberRandomAccess&>);
186*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, const BeginMemberRandomAccess&&>);
1876842f52aSArthur O'Dwyer
1886842f52aSArthur O'Dwyer struct BeginFriendContiguousIterator {
1896842f52aSArthur O'Dwyer int buff[8];
1906842f52aSArthur O'Dwyer
begin(const BeginFriendContiguousIterator & iter)1916842f52aSArthur O'Dwyer friend constexpr ContiguousIter begin(const BeginFriendContiguousIterator &iter) {
1926842f52aSArthur O'Dwyer return ContiguousIter(iter.buff);
1936842f52aSArthur O'Dwyer }
1946842f52aSArthur O'Dwyer };
1956842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator &>);
1966842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator &&>);
1976842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator const&>);
1986842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberContiguousIterator const&&>);
199*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator &>);
200*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator &&>);
201*483f7f55SArthur O'Dwyer static_assert( std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator const&>);
202*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberContiguousIterator const&&>);
2036842f52aSArthur O'Dwyer
2046842f52aSArthur O'Dwyer struct BeginFriendRandomAccess {
2056842f52aSArthur O'Dwyer friend random_access_iterator<const int*> begin(const BeginFriendRandomAccess iter);
2066842f52aSArthur O'Dwyer };
2071716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginFriendRandomAccess&>);
2081716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginFriendRandomAccess&&>);
2091716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, const BeginFriendRandomAccess&>);
2101716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, const BeginFriendRandomAccess&&>);
211*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginFriendRandomAccess&>);
212*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginFriendRandomAccess&&>);
213*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, const BeginFriendRandomAccess&>);
214*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, const BeginFriendRandomAccess&&>);
2156842f52aSArthur O'Dwyer
2166842f52aSArthur O'Dwyer struct BeginMemberRvalue {
2176842f52aSArthur O'Dwyer int buff[8];
2186842f52aSArthur O'Dwyer
2196842f52aSArthur O'Dwyer ContiguousIter begin() &&;
2206842f52aSArthur O'Dwyer };
2214163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberRvalue&>);
2226842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberRvalue&&>);
2236842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberRvalue const&>);
2244163f61fSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberRvalue const&&>);
225*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberRvalue&>);
226*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberRvalue&&>);
227*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberRvalue const&>);
228*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberRvalue const&&>);
2296842f52aSArthur O'Dwyer
2306842f52aSArthur O'Dwyer struct BeginMemberBorrowingEnabled {
beginBeginMemberBorrowingEnabled2316842f52aSArthur O'Dwyer constexpr contiguous_iterator<int*> begin() { return contiguous_iterator<int*>{&globalBuff[1]}; }
2326842f52aSArthur O'Dwyer };
2336842f52aSArthur O'Dwyer template<>
2346842f52aSArthur O'Dwyer inline constexpr bool std::ranges::enable_borrowed_range<BeginMemberBorrowingEnabled> = true;
2356842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, BeginMemberBorrowingEnabled &>);
2366842f52aSArthur O'Dwyer static_assert( std::is_invocable_v<RangeDataT, BeginMemberBorrowingEnabled &&>);
2376842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberBorrowingEnabled const&>);
2386842f52aSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, BeginMemberBorrowingEnabled const&&>);
239*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberBorrowingEnabled &>);
240*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberBorrowingEnabled &&>);
241*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberBorrowingEnabled const&>);
242*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, BeginMemberBorrowingEnabled const&&>);
2436842f52aSArthur O'Dwyer
testViaRangesBegin()2446842f52aSArthur O'Dwyer constexpr bool testViaRangesBegin() {
2456842f52aSArthur O'Dwyer int arr[2];
2466842f52aSArthur O'Dwyer assert(std::ranges::data(arr) == arr + 0);
247*483f7f55SArthur O'Dwyer assert(std::ranges::cdata(arr) == arr + 0);
2486842f52aSArthur O'Dwyer
2496842f52aSArthur O'Dwyer BeginMemberContiguousIterator a;
2506842f52aSArthur O'Dwyer assert(std::ranges::data(a) == a.buff);
251*483f7f55SArthur O'Dwyer assert(std::ranges::cdata(a) == a.buff);
2526842f52aSArthur O'Dwyer
2536842f52aSArthur O'Dwyer const BeginFriendContiguousIterator b {};
2546842f52aSArthur O'Dwyer assert(std::ranges::data(b) == b.buff);
255*483f7f55SArthur O'Dwyer assert(std::ranges::cdata(b) == b.buff);
2566842f52aSArthur O'Dwyer
2576842f52aSArthur O'Dwyer BeginMemberBorrowingEnabled c;
2586842f52aSArthur O'Dwyer assert(std::ranges::data(std::move(c)) == &globalBuff[1]);
259*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, decltype(std::move(c))>);
2606842f52aSArthur O'Dwyer
2616842f52aSArthur O'Dwyer return true;
2626842f52aSArthur O'Dwyer }
2636842f52aSArthur O'Dwyer
26485073836SArthur O'Dwyer // Test ADL-proofing.
26585073836SArthur O'Dwyer struct Incomplete;
26685073836SArthur O'Dwyer template<class T> struct Holder { T t; };
26785073836SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, Holder<Incomplete>*>);
2689be193bcSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, Holder<Incomplete>*&>);
269*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, Holder<Incomplete>*>);
270*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, Holder<Incomplete>*&>);
27185073836SArthur O'Dwyer
2721716c36dSArthur O'Dwyer struct RandomButNotContiguous {
2731716c36dSArthur O'Dwyer random_access_iterator<int*> begin() const;
2741716c36dSArthur O'Dwyer random_access_iterator<int*> end() const;
2751716c36dSArthur O'Dwyer };
2761716c36dSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, RandomButNotContiguous>);
2779be193bcSArthur O'Dwyer static_assert(!std::is_invocable_v<RangeDataT, RandomButNotContiguous&>);
278*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, RandomButNotContiguous>);
279*483f7f55SArthur O'Dwyer static_assert(!std::is_invocable_v<RangeCDataT, RandomButNotContiguous&>);
2801716c36dSArthur O'Dwyer
main(int,char **)2816842f52aSArthur O'Dwyer int main(int, char**) {
2824163f61fSArthur O'Dwyer static_assert(testReturnTypes());
2834163f61fSArthur O'Dwyer
2846842f52aSArthur O'Dwyer testDataMember();
2856842f52aSArthur O'Dwyer static_assert(testDataMember());
2866842f52aSArthur O'Dwyer
2876842f52aSArthur O'Dwyer testViaRangesBegin();
2886842f52aSArthur O'Dwyer static_assert(testViaRangesBegin());
2896842f52aSArthur O'Dwyer
2906842f52aSArthur O'Dwyer return 0;
2916842f52aSArthur O'Dwyer }
292