14d6d9812SNick Kledzik //===- llvm/unittest/ADT/ArrayRefTest.cpp - ArrayRef unit tests -----------===//
24d6d9812SNick Kledzik //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64d6d9812SNick Kledzik //
74d6d9812SNick Kledzik //===----------------------------------------------------------------------===//
84d6d9812SNick Kledzik 
94d6d9812SNick Kledzik #include "llvm/ADT/ArrayRef.h"
104d6d9812SNick Kledzik #include "llvm/Support/Allocator.h"
114d6d9812SNick Kledzik #include "llvm/Support/raw_ostream.h"
124d6d9812SNick Kledzik #include "gtest/gtest.h"
13877e3cefSVedant Kumar #include <limits>
14a9614171SAaron Ballman #include <vector>
154d6d9812SNick Kledzik using namespace llvm;
164d6d9812SNick Kledzik 
17ee03eadcSDavid Blaikie // Check that the ArrayRef-of-pointer converting constructor only allows adding
18ee03eadcSDavid Blaikie // cv qualifiers (not removing them, or otherwise changing the type)
19ee03eadcSDavid Blaikie static_assert(
20ee03eadcSDavid Blaikie     std::is_convertible<ArrayRef<int *>, ArrayRef<const int *>>::value,
21ee03eadcSDavid Blaikie     "Adding const");
22ee03eadcSDavid Blaikie static_assert(
23ee03eadcSDavid Blaikie     std::is_convertible<ArrayRef<int *>, ArrayRef<volatile int *>>::value,
24ee03eadcSDavid Blaikie     "Adding volatile");
25ee03eadcSDavid Blaikie static_assert(!std::is_convertible<ArrayRef<int *>, ArrayRef<float *>>::value,
26ee03eadcSDavid Blaikie               "Changing pointer of one type to a pointer of another");
27ee03eadcSDavid Blaikie static_assert(
28ee03eadcSDavid Blaikie     !std::is_convertible<ArrayRef<const int *>, ArrayRef<int *>>::value,
29ee03eadcSDavid Blaikie     "Removing const");
30ee03eadcSDavid Blaikie static_assert(
31ee03eadcSDavid Blaikie     !std::is_convertible<ArrayRef<volatile int *>, ArrayRef<int *>>::value,
32ee03eadcSDavid Blaikie     "Removing volatile");
33ee03eadcSDavid Blaikie 
34764f9f78SJordan Rose // Check that we can't accidentally assign a temporary location to an ArrayRef.
35764f9f78SJordan Rose // (Unfortunately we can't make use of the same thing with constructors.)
36764f9f78SJordan Rose static_assert(
3760707939SRichard Smith     !std::is_assignable<ArrayRef<int *>&, int *>::value,
38764f9f78SJordan Rose     "Assigning from single prvalue element");
39764f9f78SJordan Rose static_assert(
4060707939SRichard Smith     !std::is_assignable<ArrayRef<int *>&, int * &&>::value,
41764f9f78SJordan Rose     "Assigning from single xvalue element");
42764f9f78SJordan Rose static_assert(
4360707939SRichard Smith     std::is_assignable<ArrayRef<int *>&, int * &>::value,
44764f9f78SJordan Rose     "Assigning from single lvalue element");
45764f9f78SJordan Rose static_assert(
4660707939SRichard Smith     !std::is_assignable<ArrayRef<int *>&, std::initializer_list<int *>>::value,
47764f9f78SJordan Rose     "Assigning from an initializer list");
48764f9f78SJordan Rose 
4907f42cd5SBenjamin Kramer namespace {
504d6d9812SNick Kledzik 
TEST(ArrayRefTest,AllocatorCopy)514d6d9812SNick Kledzik TEST(ArrayRefTest, AllocatorCopy) {
524d6d9812SNick Kledzik   BumpPtrAllocator Alloc;
534d6d9812SNick Kledzik   static const uint16_t Words1[] = { 1, 4, 200, 37 };
544d6d9812SNick Kledzik   ArrayRef<uint16_t> Array1 = makeArrayRef(Words1, 4);
554d6d9812SNick Kledzik   static const uint16_t Words2[] = { 11, 4003, 67, 64000, 13 };
564d6d9812SNick Kledzik   ArrayRef<uint16_t> Array2 = makeArrayRef(Words2, 5);
574d6d9812SNick Kledzik   ArrayRef<uint16_t> Array1c = Array1.copy(Alloc);
583182ee92SAaron Ballman   ArrayRef<uint16_t> Array2c = Array2.copy(Alloc);
594d6d9812SNick Kledzik   EXPECT_TRUE(Array1.equals(Array1c));
604d6d9812SNick Kledzik   EXPECT_NE(Array1.data(), Array1c.data());
614d6d9812SNick Kledzik   EXPECT_TRUE(Array2.equals(Array2c));
624d6d9812SNick Kledzik   EXPECT_NE(Array2.data(), Array2c.data());
6307f42cd5SBenjamin Kramer 
6407f42cd5SBenjamin Kramer   // Check that copy can cope with uninitialized memory.
6507f42cd5SBenjamin Kramer   struct NonAssignable {
6607f42cd5SBenjamin Kramer     const char *Ptr;
6707f42cd5SBenjamin Kramer 
68bee48597SBenjamin Kramer     NonAssignable(const char *Ptr) : Ptr(Ptr) {}
6907f42cd5SBenjamin Kramer     NonAssignable(const NonAssignable &RHS) = default;
7007f42cd5SBenjamin Kramer     void operator=(const NonAssignable &RHS) { assert(RHS.Ptr != nullptr); }
7107f42cd5SBenjamin Kramer     bool operator==(const NonAssignable &RHS) const { return Ptr == RHS.Ptr; }
72bee48597SBenjamin Kramer   } Array3Src[] = {"hello", "world"};
7307f42cd5SBenjamin Kramer   ArrayRef<NonAssignable> Array3Copy = makeArrayRef(Array3Src).copy(Alloc);
7407f42cd5SBenjamin Kramer   EXPECT_EQ(makeArrayRef(Array3Src), Array3Copy);
7507f42cd5SBenjamin Kramer   EXPECT_NE(makeArrayRef(Array3Src).data(), Array3Copy.data());
764d6d9812SNick Kledzik }
774d6d9812SNick Kledzik 
78abb34df4SRoman Lebedev // This test is pure UB given the ArrayRef<> implementation.
79abb34df4SRoman Lebedev // You are not allowed to produce non-null pointers given null base pointer.
TEST(ArrayRefTest,DISABLED_SizeTSizedOperations)80abb34df4SRoman Lebedev TEST(ArrayRefTest, DISABLED_SizeTSizedOperations) {
81877e3cefSVedant Kumar   ArrayRef<char> AR(nullptr, std::numeric_limits<ptrdiff_t>::max());
82877e3cefSVedant Kumar 
83877e3cefSVedant Kumar   // Check that drop_back accepts size_t-sized numbers.
84877e3cefSVedant Kumar   EXPECT_EQ(1U, AR.drop_back(AR.size() - 1).size());
85877e3cefSVedant Kumar 
86877e3cefSVedant Kumar   // Check that drop_front accepts size_t-sized numbers.
87877e3cefSVedant Kumar   EXPECT_EQ(1U, AR.drop_front(AR.size() - 1).size());
88877e3cefSVedant Kumar 
89877e3cefSVedant Kumar   // Check that slice accepts size_t-sized numbers.
90877e3cefSVedant Kumar   EXPECT_EQ(1U, AR.slice(AR.size() - 1).size());
91877e3cefSVedant Kumar   EXPECT_EQ(AR.size() - 1, AR.slice(1, AR.size() - 1).size());
92877e3cefSVedant Kumar }
93877e3cefSVedant Kumar 
TEST(ArrayRefTest,DropBack)9445647d8fSDavid Majnemer TEST(ArrayRefTest, DropBack) {
9545647d8fSDavid Majnemer   static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
9645647d8fSDavid Majnemer   ArrayRef<int> AR1(TheNumbers);
9745647d8fSDavid Majnemer   ArrayRef<int> AR2(TheNumbers, AR1.size() - 1);
9845647d8fSDavid Majnemer   EXPECT_TRUE(AR1.drop_back().equals(AR2));
9945647d8fSDavid Majnemer }
10045647d8fSDavid Majnemer 
TEST(ArrayRefTest,DropFront)1011e4ba37dSReid Kleckner TEST(ArrayRefTest, DropFront) {
1021e4ba37dSReid Kleckner   static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
1031e4ba37dSReid Kleckner   ArrayRef<int> AR1(TheNumbers);
1041e4ba37dSReid Kleckner   ArrayRef<int> AR2(&TheNumbers[2], AR1.size() - 2);
1051e4ba37dSReid Kleckner   EXPECT_TRUE(AR1.drop_front(2).equals(AR2));
1061e4ba37dSReid Kleckner }
1071e4ba37dSReid Kleckner 
TEST(ArrayRefTest,DropWhile)108eaf0ada6SZachary Turner TEST(ArrayRefTest, DropWhile) {
109eaf0ada6SZachary Turner   static const int TheNumbers[] = {1, 3, 5, 8, 10, 11};
110eaf0ada6SZachary Turner   ArrayRef<int> AR1(TheNumbers);
111eaf0ada6SZachary Turner   ArrayRef<int> Expected = AR1.drop_front(3);
112eaf0ada6SZachary Turner   EXPECT_EQ(Expected, AR1.drop_while([](const int &N) { return N % 2 == 1; }));
113eaf0ada6SZachary Turner 
114eaf0ada6SZachary Turner   EXPECT_EQ(AR1, AR1.drop_while([](const int &N) { return N < 0; }));
115eaf0ada6SZachary Turner   EXPECT_EQ(ArrayRef<int>(),
116eaf0ada6SZachary Turner             AR1.drop_while([](const int &N) { return N > 0; }));
117eaf0ada6SZachary Turner }
118eaf0ada6SZachary Turner 
TEST(ArrayRefTest,DropUntil)119eaf0ada6SZachary Turner TEST(ArrayRefTest, DropUntil) {
120eaf0ada6SZachary Turner   static const int TheNumbers[] = {1, 3, 5, 8, 10, 11};
121eaf0ada6SZachary Turner   ArrayRef<int> AR1(TheNumbers);
122eaf0ada6SZachary Turner   ArrayRef<int> Expected = AR1.drop_front(3);
123eaf0ada6SZachary Turner   EXPECT_EQ(Expected, AR1.drop_until([](const int &N) { return N % 2 == 0; }));
124eaf0ada6SZachary Turner 
125eaf0ada6SZachary Turner   EXPECT_EQ(ArrayRef<int>(),
126eaf0ada6SZachary Turner             AR1.drop_until([](const int &N) { return N < 0; }));
127eaf0ada6SZachary Turner   EXPECT_EQ(AR1, AR1.drop_until([](const int &N) { return N > 0; }));
128eaf0ada6SZachary Turner }
129eaf0ada6SZachary Turner 
TEST(ArrayRefTest,TakeBack)130613c0752SZachary Turner TEST(ArrayRefTest, TakeBack) {
13184fc059eSZachary Turner   static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
13284fc059eSZachary Turner   ArrayRef<int> AR1(TheNumbers);
13384fc059eSZachary Turner   ArrayRef<int> AR2(AR1.end() - 1, 1);
134613c0752SZachary Turner   EXPECT_TRUE(AR1.take_back().equals(AR2));
13584fc059eSZachary Turner }
13684fc059eSZachary Turner 
TEST(ArrayRefTest,TakeFront)137613c0752SZachary Turner TEST(ArrayRefTest, TakeFront) {
13884fc059eSZachary Turner   static const int TheNumbers[] = {4, 8, 15, 16, 23, 42};
13984fc059eSZachary Turner   ArrayRef<int> AR1(TheNumbers);
14084fc059eSZachary Turner   ArrayRef<int> AR2(AR1.data(), 2);
141613c0752SZachary Turner   EXPECT_TRUE(AR1.take_front(2).equals(AR2));
14284fc059eSZachary Turner }
14384fc059eSZachary Turner 
TEST(ArrayRefTest,TakeWhile)144eaf0ada6SZachary Turner TEST(ArrayRefTest, TakeWhile) {
145eaf0ada6SZachary Turner   static const int TheNumbers[] = {1, 3, 5, 8, 10, 11};
146eaf0ada6SZachary Turner   ArrayRef<int> AR1(TheNumbers);
147eaf0ada6SZachary Turner   ArrayRef<int> Expected = AR1.take_front(3);
148eaf0ada6SZachary Turner   EXPECT_EQ(Expected, AR1.take_while([](const int &N) { return N % 2 == 1; }));
149eaf0ada6SZachary Turner 
150eaf0ada6SZachary Turner   EXPECT_EQ(ArrayRef<int>(),
151eaf0ada6SZachary Turner             AR1.take_while([](const int &N) { return N < 0; }));
152eaf0ada6SZachary Turner   EXPECT_EQ(AR1, AR1.take_while([](const int &N) { return N > 0; }));
153eaf0ada6SZachary Turner }
154eaf0ada6SZachary Turner 
TEST(ArrayRefTest,TakeUntil)155eaf0ada6SZachary Turner TEST(ArrayRefTest, TakeUntil) {
156eaf0ada6SZachary Turner   static const int TheNumbers[] = {1, 3, 5, 8, 10, 11};
157eaf0ada6SZachary Turner   ArrayRef<int> AR1(TheNumbers);
158eaf0ada6SZachary Turner   ArrayRef<int> Expected = AR1.take_front(3);
159eaf0ada6SZachary Turner   EXPECT_EQ(Expected, AR1.take_until([](const int &N) { return N % 2 == 0; }));
160eaf0ada6SZachary Turner 
161eaf0ada6SZachary Turner   EXPECT_EQ(AR1, AR1.take_until([](const int &N) { return N < 0; }));
162eaf0ada6SZachary Turner   EXPECT_EQ(ArrayRef<int>(),
163eaf0ada6SZachary Turner             AR1.take_until([](const int &N) { return N > 0; }));
164eaf0ada6SZachary Turner }
165eaf0ada6SZachary Turner 
TEST(ArrayRefTest,Equals)1663ea985b3SChandler Carruth TEST(ArrayRefTest, Equals) {
1673ea985b3SChandler Carruth   static const int A1[] = {1, 2, 3, 4, 5, 6, 7, 8};
1683ea985b3SChandler Carruth   ArrayRef<int> AR1(A1);
169030133c5SBenjamin Kramer   EXPECT_TRUE(AR1.equals({1, 2, 3, 4, 5, 6, 7, 8}));
170030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({8, 1, 2, 4, 5, 6, 6, 7}));
171030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({2, 4, 5, 6, 6, 7, 8, 1}));
172030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({0, 1, 2, 4, 5, 6, 6, 7}));
173030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({1, 2, 42, 4, 5, 6, 7, 8}));
174030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({42, 2, 3, 4, 5, 6, 7, 8}));
175030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({1, 2, 3, 4, 5, 6, 7, 42}));
176030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({1, 2, 3, 4, 5, 6, 7}));
177030133c5SBenjamin Kramer   EXPECT_FALSE(AR1.equals({1, 2, 3, 4, 5, 6, 7, 8, 9}));
1783ea985b3SChandler Carruth 
1793ea985b3SChandler Carruth   ArrayRef<int> AR1a = AR1.drop_back();
180030133c5SBenjamin Kramer   EXPECT_TRUE(AR1a.equals({1, 2, 3, 4, 5, 6, 7}));
181030133c5SBenjamin Kramer   EXPECT_FALSE(AR1a.equals({1, 2, 3, 4, 5, 6, 7, 8}));
1823ea985b3SChandler Carruth 
1833ea985b3SChandler Carruth   ArrayRef<int> AR1b = AR1a.slice(2, 4);
184030133c5SBenjamin Kramer   EXPECT_TRUE(AR1b.equals({3, 4, 5, 6}));
185030133c5SBenjamin Kramer   EXPECT_FALSE(AR1b.equals({2, 3, 4, 5, 6}));
186030133c5SBenjamin Kramer   EXPECT_FALSE(AR1b.equals({3, 4, 5, 6, 7}));
1873ea985b3SChandler Carruth }
1884d6d9812SNick Kledzik 
TEST(ArrayRefTest,EmptyEquals)189349f6982SDuncan P. N. Exon Smith TEST(ArrayRefTest, EmptyEquals) {
190349f6982SDuncan P. N. Exon Smith   EXPECT_TRUE(ArrayRef<unsigned>() == ArrayRef<unsigned>());
191349f6982SDuncan P. N. Exon Smith }
192349f6982SDuncan P. N. Exon Smith 
TEST(ArrayRefTest,ConstConvert)193c9439cc8SCraig Topper TEST(ArrayRefTest, ConstConvert) {
194c9439cc8SCraig Topper   int buf[4];
195c9439cc8SCraig Topper   for (int i = 0; i < 4; ++i)
196c9439cc8SCraig Topper     buf[i] = i;
197c9439cc8SCraig Topper 
198c9439cc8SCraig Topper   static int *A[] = {&buf[0], &buf[1], &buf[2], &buf[3]};
199c9439cc8SCraig Topper   ArrayRef<const int *> a((ArrayRef<int *>(A)));
200c9439cc8SCraig Topper   a = ArrayRef<int *>(A);
201c9439cc8SCraig Topper }
202c9439cc8SCraig Topper 
ReturnTest12()203a9614171SAaron Ballman static std::vector<int> ReturnTest12() { return {1, 2}; }
ArgTest12(ArrayRef<int> A)204fbb030f0SAaron Ballman static void ArgTest12(ArrayRef<int> A) {
205a9614171SAaron Ballman   EXPECT_EQ(2U, A.size());
206fbb030f0SAaron Ballman   EXPECT_EQ(1, A[0]);
207fbb030f0SAaron Ballman   EXPECT_EQ(2, A[1]);
208fbb030f0SAaron Ballman }
209fbb030f0SAaron Ballman 
TEST(ArrayRefTest,InitializerList)210f4984a96SAaron Ballman TEST(ArrayRefTest, InitializerList) {
21168ce7928SDavid Blaikie   std::initializer_list<int> init_list = { 0, 1, 2, 3, 4 };
21268ce7928SDavid Blaikie   ArrayRef<int> A = init_list;
213f4984a96SAaron Ballman   for (int i = 0; i < 5; ++i)
214f4984a96SAaron Ballman     EXPECT_EQ(i, A[i]);
215fbb030f0SAaron Ballman 
216a9614171SAaron Ballman   std::vector<int> B = ReturnTest12();
217a9614171SAaron Ballman   A = B;
218fbb030f0SAaron Ballman   EXPECT_EQ(1, A[0]);
219fbb030f0SAaron Ballman   EXPECT_EQ(2, A[1]);
220fbb030f0SAaron Ballman 
221fbb030f0SAaron Ballman   ArgTest12({1, 2});
222f4984a96SAaron Ballman }
223f4984a96SAaron Ballman 
TEST(ArrayRefTest,EmptyInitializerList)224764f9f78SJordan Rose TEST(ArrayRefTest, EmptyInitializerList) {
225764f9f78SJordan Rose   ArrayRef<int> A = {};
226764f9f78SJordan Rose   EXPECT_TRUE(A.empty());
227764f9f78SJordan Rose 
228764f9f78SJordan Rose   A = {};
229764f9f78SJordan Rose   EXPECT_TRUE(A.empty());
230764f9f78SJordan Rose }
231764f9f78SJordan Rose 
TEST(ArrayRefTest,makeArrayRef)232defa5465SMehdi Amini TEST(ArrayRefTest, makeArrayRef) {
233defa5465SMehdi Amini   static const int A1[] = {1, 2, 3, 4, 5, 6, 7, 8};
234defa5465SMehdi Amini 
235defa5465SMehdi Amini   // No copy expected for non-const ArrayRef (true no-op)
236defa5465SMehdi Amini   ArrayRef<int> AR1(A1);
237defa5465SMehdi Amini   ArrayRef<int> &AR1Ref = makeArrayRef(AR1);
238defa5465SMehdi Amini   EXPECT_EQ(&AR1, &AR1Ref);
239defa5465SMehdi Amini 
240defa5465SMehdi Amini   // A copy is expected for non-const ArrayRef (thin copy)
241defa5465SMehdi Amini   const ArrayRef<int> AR2(A1);
242defa5465SMehdi Amini   const ArrayRef<int> &AR2Ref = makeArrayRef(AR2);
243defa5465SMehdi Amini   EXPECT_NE(&AR2Ref, &AR2);
244defa5465SMehdi Amini   EXPECT_TRUE(AR2.equals(AR2Ref));
245defa5465SMehdi Amini }
246defa5465SMehdi Amini 
TEST(ArrayRefTest,OwningArrayRef)24767c29e22SFangrui Song TEST(ArrayRefTest, OwningArrayRef) {
24867c29e22SFangrui Song   static const int A1[] = {0, 1};
24967c29e22SFangrui Song   OwningArrayRef<int> A(makeArrayRef(A1));
25067c29e22SFangrui Song   OwningArrayRef<int> B(std::move(A));
25167c29e22SFangrui Song   EXPECT_EQ(A.data(), nullptr);
25267c29e22SFangrui Song }
25367c29e22SFangrui Song 
TEST(ArrayRefTest,makeArrayRefFromStdArray)25479707ecdSJan Korous TEST(ArrayRefTest, makeArrayRefFromStdArray) {
2554de7ae65SHuihui Zhang   std::array<int, 5> A1{{42, -5, 0, 1000000, -1000000}};
25679707ecdSJan Korous   ArrayRef<int> A2 = makeArrayRef(A1);
25779707ecdSJan Korous 
25879707ecdSJan Korous   EXPECT_EQ(A1.size(), A2.size());
25979707ecdSJan Korous   for (std::size_t i = 0; i < A1.size(); ++i) {
26079707ecdSJan Korous     EXPECT_EQ(A1[i], A2[i]);
26179707ecdSJan Korous   }
26279707ecdSJan Korous }
26379707ecdSJan Korous 
2641d6ebdfbSFangrui Song static_assert(std::is_trivially_copyable<ArrayRef<int>>::value,
265be88539bSSerge Guelton               "trivially copyable");
266be88539bSSerge Guelton 
TEST(ArrayRefTest,makeMutableArrayRef)267*f971e77fSNicolai Hähnle TEST(ArrayRefTest, makeMutableArrayRef) {
268*f971e77fSNicolai Hähnle   int A = 0;
269*f971e77fSNicolai Hähnle   auto AR = makeMutableArrayRef(A);
270*f971e77fSNicolai Hähnle   EXPECT_EQ(AR.data(), &A);
271*f971e77fSNicolai Hähnle   EXPECT_EQ(AR.size(), (size_t)1);
272*f971e77fSNicolai Hähnle 
273*f971e77fSNicolai Hähnle   AR[0] = 1;
274*f971e77fSNicolai Hähnle   EXPECT_EQ(A, 1);
275*f971e77fSNicolai Hähnle 
276*f971e77fSNicolai Hähnle   int B[] = {0, 1, 2, 3};
277*f971e77fSNicolai Hähnle   auto BR1 = makeMutableArrayRef(&B[0], 4);
278*f971e77fSNicolai Hähnle   auto BR2 = makeMutableArrayRef(B);
279*f971e77fSNicolai Hähnle   EXPECT_EQ(BR1.data(), &B[0]);
280*f971e77fSNicolai Hähnle   EXPECT_EQ(BR1.size(), (size_t)4);
281*f971e77fSNicolai Hähnle   EXPECT_EQ(BR2.data(), &B[0]);
282*f971e77fSNicolai Hähnle   EXPECT_EQ(BR2.size(), (size_t)4);
283*f971e77fSNicolai Hähnle 
284*f971e77fSNicolai Hähnle   SmallVector<int> C1;
285*f971e77fSNicolai Hähnle   SmallVectorImpl<int> &C2 = C1;
286*f971e77fSNicolai Hähnle   C1.resize(5);
287*f971e77fSNicolai Hähnle   auto CR1 = makeMutableArrayRef(C1);
288*f971e77fSNicolai Hähnle   auto CR2 = makeMutableArrayRef(C2);
289*f971e77fSNicolai Hähnle   EXPECT_EQ(CR1.data(), C1.data());
290*f971e77fSNicolai Hähnle   EXPECT_EQ(CR1.size(), C1.size());
291*f971e77fSNicolai Hähnle   EXPECT_EQ(CR2.data(), C2.data());
292*f971e77fSNicolai Hähnle   EXPECT_EQ(CR2.size(), C2.size());
293*f971e77fSNicolai Hähnle 
294*f971e77fSNicolai Hähnle   std::vector<int> D;
295*f971e77fSNicolai Hähnle   D.resize(5);
296*f971e77fSNicolai Hähnle   auto DR = makeMutableArrayRef(D);
297*f971e77fSNicolai Hähnle   EXPECT_EQ(DR.data(), D.data());
298*f971e77fSNicolai Hähnle   EXPECT_EQ(DR.size(), D.size());
299*f971e77fSNicolai Hähnle 
300*f971e77fSNicolai Hähnle   std::array<int, 5> E;
301*f971e77fSNicolai Hähnle   auto ER = makeMutableArrayRef(E);
302*f971e77fSNicolai Hähnle   EXPECT_EQ(ER.data(), E.data());
303*f971e77fSNicolai Hähnle   EXPECT_EQ(ER.size(), E.size());
304*f971e77fSNicolai Hähnle }
305*f971e77fSNicolai Hähnle 
3064d6d9812SNick Kledzik } // end anonymous namespace
307