diff options
author | Joe Loser <joeloser@fastmail.com> | 2023-01-09 15:37:11 -0700 |
---|---|---|
committer | Joe Loser <joeloser@fastmail.com> | 2023-01-10 13:02:34 -0700 |
commit | 38791259c1165cedfa313e06dc20e443f1e20634 (patch) | |
tree | 084224acc86c6d73dbba681e538a069d6bf039d0 /llvm/unittests/ADT/ArrayRefTest.cpp | |
parent | 9f3081dc6fe8447e85741865846840bc491866e5 (diff) | |
download | llvm-38791259c1165cedfa313e06dc20e443f1e20634.zip llvm-38791259c1165cedfa313e06dc20e443f1e20634.tar.gz llvm-38791259c1165cedfa313e06dc20e443f1e20634.tar.bz2 |
[llvm][ADT] Add deduction guides for `MutableArrayRef`
Similar to https://reviews.llvm.org/D140896, this adds deduction guides for the
counterpart of `ArrayRef`: `MutableArrayRef`. The update plan is the following:
1) Add deduction guides for `MutableArrayRef`.
2) Change uses in-tree from `makeMutableArrayRef` to use deduction guides
3) Mark `makeMutableArrayRef` as deprecated for some time before removing to
give downstream users time to update.
The deduction guides are similar to those provided by the `makeMutableArrayRef`
function templates, except we don't need one explicitly from `MutableArrayRef`.
Differential Revision: https://reviews.llvm.org/D141327
Diffstat (limited to 'llvm/unittests/ADT/ArrayRefTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/ArrayRefTest.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/ArrayRefTest.cpp b/llvm/unittests/ADT/ArrayRefTest.cpp index 0aea5a9..13a9d56 100644 --- a/llvm/unittests/ADT/ArrayRefTest.cpp +++ b/llvm/unittests/ADT/ArrayRefTest.cpp @@ -297,4 +297,94 @@ TEST(ArrayRefTest, makeMutableArrayRef) { EXPECT_EQ(ER.size(), E.size()); } +TEST(ArrayRefTest, MutableArrayRefDeductionGuides) { + // Single element + { + int x = 0; + auto aref = MutableArrayRef(x); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), &x); + EXPECT_EQ(aref.size(), 1u); + + // Make sure it's mutable still + aref[0] = 1; + EXPECT_EQ(x, 1); + } + + // Pointer + length + { + int x[] = {0, 1, 2, 3}; + auto aref = MutableArrayRef(&x[0], 4); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), &x[0]); + EXPECT_EQ(aref.size(), 4u); + } + + // // Pointer + pointer + { + int x[] = {0, 1, 2, 3}; + auto aref = MutableArrayRef(std::begin(x), std::end(x)); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), &x[0]); + EXPECT_EQ(aref.size(), 4u); + } + + // SmallVector + { + SmallVector<int> sv1; + SmallVectorImpl<int> &sv2 = sv1; + sv1.resize(5); + auto aref1 = MutableArrayRef(sv1); + auto aref2 = MutableArrayRef(sv2); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref1)>); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref2)>); + EXPECT_EQ(aref1.data(), sv1.data()); + EXPECT_EQ(aref1.size(), sv1.size()); + EXPECT_EQ(aref2.data(), sv2.data()); + EXPECT_EQ(aref2.size(), sv2.size()); + } + + // std::vector + { + std::vector<int> x(5); + auto aref = MutableArrayRef(x); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), x.data()); + EXPECT_EQ(aref.size(), x.size()); + } + + // std::array + { + std::array<int, 5> x{}; + auto aref = MutableArrayRef(x); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), x.data()); + EXPECT_EQ(aref.size(), x.size()); + } + + // MutableArrayRef + { + MutableArrayRef<int> x{}; + auto aref = MutableArrayRef(x); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), x.data()); + EXPECT_EQ(aref.size(), x.size()); + + const MutableArrayRef<int> y{}; + auto aref2 = MutableArrayRef(y); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref2)>); + EXPECT_EQ(aref2.data(), y.data()); + EXPECT_EQ(aref2.size(), y.size()); + } + + // C-style array + { + int x[] = {0, 1, 2, 3}; + auto aref = MutableArrayRef(x); + static_assert(std::is_same_v<MutableArrayRef<int>, decltype(aref)>); + EXPECT_EQ(aref.data(), &x[0]); + EXPECT_EQ(aref.size(), 4u); + } +} + } // end anonymous namespace |