diff options
Diffstat (limited to 'llvm/unittests/ADT/ArrayRefTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/ArrayRefTest.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp index fb25ee1..a9d682c 100644 --- a/llvm/unittests/ADT/ArrayRefTest.cpp +++ b/llvm/unittests/ADT/ArrayRefTest.cpp @@ -255,6 +255,64 @@ TEST(ArrayRefTest, ArrayRefFromStdArray) { } } +struct TestRandomAccessIterator { + using iterator_category = std::random_access_iterator_tag; +}; + +static_assert(!std::is_constructible_v< + ArrayRef<int>, iterator_range<TestRandomAccessIterator>>, + "cannot construct from iterator range with non-pointer iterator"); +static_assert(!std::is_constructible_v<ArrayRef<int>, iterator_range<int>>, + "cannot construct from iterator range with non-pointer iterator"); + +class TestBase {}; + +class TestDerived : public TestBase {}; + +static_assert( + !std::is_constructible_v<ArrayRef<TestDerived>, iterator_range<TestBase *>>, + "cannot construct ArrayRef with derived type"); +static_assert( + !std::is_constructible_v<ArrayRef<TestBase>, iterator_range<TestDerived *>>, + "cannot construct ArrayRef base type"); +static_assert(!std::is_constructible_v<ArrayRef<TestBase *>, + iterator_range<TestDerived **>>, + "cannot construct ArrayRef pointer of base type"); + +static_assert( + !std::is_constructible_v<ArrayRef<int>, iterator_range<const int *>>, + "cannot construct ArrayRef with non-const elements from const iterator " + "range"); +static_assert( + std::is_constructible_v<ArrayRef<char *>, iterator_range<char **>>, + "should be able to construct ArrayRef from iterator_range over pointers"); +static_assert( + !std::is_constructible_v<ArrayRef<char *>, iterator_range<char *const *>>, + "should be able to construct ArrayRef from iterator_range over pointers"); + +TEST(ArrayRefTest, ArrayRefFromIteratorRange) { + std::array<int, 5> A1{{42, -5, 0, 1000000, -1000000}}; + ArrayRef<int> A2 = make_range(A1.begin(), A1.end()); + + EXPECT_EQ(A1.size(), A2.size()); + for (std::size_t i = 0; i < A1.size(); ++i) + EXPECT_EQ(A1[i], A2[i]); + + ArrayRef<const int> A3 = make_range(A1.begin(), A1.end()); + EXPECT_EQ(A1.size(), A3.size()); + for (std::size_t i = 0; i < A1.size(); ++i) + EXPECT_EQ(A1[i], A3[i]); +} + +TEST(ArrayRefTest, ArrayRefFromIteratorConstRange) { + std::array<const int, 5> A1{{42, -5, 0, 1000000, -1000000}}; + ArrayRef<const int> A2 = make_range(A1.begin(), A1.end()); + + EXPECT_EQ(A1.size(), A2.size()); + for (std::size_t i = 0; i < A1.size(); ++i) + EXPECT_EQ(A1[i], A2[i]); +} + static_assert(std::is_trivially_copyable_v<ArrayRef<int>>, "trivially copyable"); |