Revert r252366: [Support] Use GetTempDir to get the temporary dir path on Windows.
[oota-llvm.git] / unittests / ADT / ArrayRefTest.cpp
index f9c98a563fa3cbb39035cac2f034e82b31f11b3f..6cbadd6bc228fa33df0cd1b2092162f9a1e99cb4 100644 (file)
@@ -11,6 +11,7 @@
 #include "llvm/Support/Allocator.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
+#include <vector>
 using namespace llvm;
 
 // Check that the ArrayRef-of-pointer converting constructor only allows adding
@@ -30,7 +31,7 @@ static_assert(
     !std::is_convertible<ArrayRef<volatile int *>, ArrayRef<int *>>::value,
     "Removing volatile");
 
-namespace llvm {
+namespace {
 
 TEST(ArrayRefTest, AllocatorCopy) {
   BumpPtrAllocator Alloc;
@@ -39,11 +40,24 @@ TEST(ArrayRefTest, AllocatorCopy) {
   static const uint16_t Words2[] = { 11, 4003, 67, 64000, 13 };
   ArrayRef<uint16_t> Array2 = makeArrayRef(Words2, 5);
   ArrayRef<uint16_t> Array1c = Array1.copy(Alloc);
-  ArrayRef<uint16_t> Array2c = Array2.copy(Alloc);;
+  ArrayRef<uint16_t> Array2c = Array2.copy(Alloc);
   EXPECT_TRUE(Array1.equals(Array1c));
   EXPECT_NE(Array1.data(), Array1c.data());
   EXPECT_TRUE(Array2.equals(Array2c));
   EXPECT_NE(Array2.data(), Array2c.data());
+
+  // Check that copy can cope with uninitialized memory.
+  struct NonAssignable {
+    const char *Ptr;
+
+    NonAssignable(const char *Ptr) : Ptr(Ptr) {}
+    NonAssignable(const NonAssignable &RHS) = default;
+    void operator=(const NonAssignable &RHS) { assert(RHS.Ptr != nullptr); }
+    bool operator==(const NonAssignable &RHS) const { return Ptr == RHS.Ptr; }
+  } Array3Src[] = {"hello", "world"};
+  ArrayRef<NonAssignable> Array3Copy = makeArrayRef(Array3Src).copy(Alloc);
+  EXPECT_EQ(makeArrayRef(Array3Src), Array3Copy);
+  EXPECT_NE(makeArrayRef(Array3Src).data(), Array3Copy.data());
 }
 
 TEST(ArrayRefTest, DropBack) {
@@ -56,24 +70,24 @@ TEST(ArrayRefTest, DropBack) {
 TEST(ArrayRefTest, Equals) {
   static const int A1[] = {1, 2, 3, 4, 5, 6, 7, 8};
   ArrayRef<int> AR1(A1);
-  EXPECT_TRUE(AR1.equals(1, 2, 3, 4, 5, 6, 7, 8));
-  EXPECT_FALSE(AR1.equals(8, 1, 2, 4, 5, 6, 6, 7));
-  EXPECT_FALSE(AR1.equals(2, 4, 5, 6, 6, 7, 8, 1));
-  EXPECT_FALSE(AR1.equals(0, 1, 2, 4, 5, 6, 6, 7));
-  EXPECT_FALSE(AR1.equals(1, 2, 42, 4, 5, 6, 7, 8));
-  EXPECT_FALSE(AR1.equals(42, 2, 3, 4, 5, 6, 7, 8));
-  EXPECT_FALSE(AR1.equals(1, 2, 3, 4, 5, 6, 7, 42));
-  EXPECT_FALSE(AR1.equals(1, 2, 3, 4, 5, 6, 7));
-  EXPECT_FALSE(AR1.equals(1, 2, 3, 4, 5, 6, 7, 8, 9));
+  EXPECT_TRUE(AR1.equals({1, 2, 3, 4, 5, 6, 7, 8}));
+  EXPECT_FALSE(AR1.equals({8, 1, 2, 4, 5, 6, 6, 7}));
+  EXPECT_FALSE(AR1.equals({2, 4, 5, 6, 6, 7, 8, 1}));
+  EXPECT_FALSE(AR1.equals({0, 1, 2, 4, 5, 6, 6, 7}));
+  EXPECT_FALSE(AR1.equals({1, 2, 42, 4, 5, 6, 7, 8}));
+  EXPECT_FALSE(AR1.equals({42, 2, 3, 4, 5, 6, 7, 8}));
+  EXPECT_FALSE(AR1.equals({1, 2, 3, 4, 5, 6, 7, 42}));
+  EXPECT_FALSE(AR1.equals({1, 2, 3, 4, 5, 6, 7}));
+  EXPECT_FALSE(AR1.equals({1, 2, 3, 4, 5, 6, 7, 8, 9}));
 
   ArrayRef<int> AR1a = AR1.drop_back();
-  EXPECT_TRUE(AR1a.equals(1, 2, 3, 4, 5, 6, 7));
-  EXPECT_FALSE(AR1a.equals(1, 2, 3, 4, 5, 6, 7, 8));
+  EXPECT_TRUE(AR1a.equals({1, 2, 3, 4, 5, 6, 7}));
+  EXPECT_FALSE(AR1a.equals({1, 2, 3, 4, 5, 6, 7, 8}));
 
   ArrayRef<int> AR1b = AR1a.slice(2, 4);
-  EXPECT_TRUE(AR1b.equals(3, 4, 5, 6));
-  EXPECT_FALSE(AR1b.equals(2, 3, 4, 5, 6));
-  EXPECT_FALSE(AR1b.equals(3, 4, 5, 6, 7));
+  EXPECT_TRUE(AR1b.equals({3, 4, 5, 6}));
+  EXPECT_FALSE(AR1b.equals({2, 3, 4, 5, 6}));
+  EXPECT_FALSE(AR1b.equals({3, 4, 5, 6, 7}));
 }
 
 TEST(ArrayRefTest, EmptyEquals) {
@@ -90,4 +104,40 @@ TEST(ArrayRefTest, ConstConvert) {
   a = ArrayRef<int *>(A);
 }
 
+static std::vector<int> ReturnTest12() { return {1, 2}; }
+static void ArgTest12(ArrayRef<int> A) {
+  EXPECT_EQ(2U, A.size());
+  EXPECT_EQ(1, A[0]);
+  EXPECT_EQ(2, A[1]);
+}
+
+TEST(ArrayRefTest, InitializerList) {
+  ArrayRef<int> A = { 0, 1, 2, 3, 4 };
+  for (int i = 0; i < 5; ++i)
+    EXPECT_EQ(i, A[i]);
+
+  std::vector<int> B = ReturnTest12();
+  A = B;
+  EXPECT_EQ(1, A[0]);
+  EXPECT_EQ(2, A[1]);
+
+  ArgTest12({1, 2});
+}
+
+// Test that makeArrayRef works on ArrayRef (no-op)
+TEST(ArrayRefTest, makeArrayRef) {
+  static const int A1[] = {1, 2, 3, 4, 5, 6, 7, 8};
+
+  // No copy expected for non-const ArrayRef (true no-op)
+  ArrayRef<int> AR1(A1);
+  ArrayRef<int> &AR1Ref = makeArrayRef(AR1);
+  EXPECT_EQ(&AR1, &AR1Ref);
+
+  // A copy is expected for non-const ArrayRef (thin copy)
+  const ArrayRef<int> AR2(A1);
+  const ArrayRef<int> &AR2Ref = makeArrayRef(AR2);
+  EXPECT_NE(&AR2Ref, &AR2);
+  EXPECT_TRUE(AR2.equals(AR2Ref));
+}
+
 } // end anonymous namespace