diff options
author | Pete Cooper <peter_cooper@apple.com> | 2016-08-17 22:06:59 +0000 |
---|---|---|
committer | Pete Cooper <peter_cooper@apple.com> | 2016-08-17 22:06:59 +0000 |
commit | 0041888aea503b0a3c08ecf5ca59ea10f6244c5b (patch) | |
tree | 8c45f1ad6fcc6976517c4e3af1e984d86a57859f /llvm/unittests/ADT/RangeAdapterTest.cpp | |
parent | 9074341618644ad226e95618be2f95b305c1b4ac (diff) | |
download | bcm5719-llvm-0041888aea503b0a3c08ecf5ca59ea10f6244c5b.tar.gz bcm5719-llvm-0041888aea503b0a3c08ecf5ca59ea10f6244c5b.zip |
Fix reverse to work on const rbegin()/rend().
Duncan found that reverse worked on mutable rbegin(), but the has_rbegin
trait didn't work with a const method. See http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20160815/382890.html
for more details.
Turns out this was already solved in clang with has_getDecl. Copied that and made it work for rbegin.
This includes the tests Duncan attached to that thread, including the traits test.
llvm-svn: 278991
Diffstat (limited to 'llvm/unittests/ADT/RangeAdapterTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/RangeAdapterTest.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/RangeAdapterTest.cpp b/llvm/unittests/ADT/RangeAdapterTest.cpp index 634f5bb990d..a4e922ecf9a 100644 --- a/llvm/unittests/ADT/RangeAdapterTest.cpp +++ b/llvm/unittests/ADT/RangeAdapterTest.cpp @@ -27,8 +27,11 @@ public: ReverseOnlyVector(std::initializer_list<int> list) : Vec(list) {} typedef std::vector<int>::reverse_iterator reverse_iterator; + typedef std::vector<int>::const_reverse_iterator const_reverse_iterator; reverse_iterator rbegin() { return Vec.rbegin(); } reverse_iterator rend() { return Vec.rend(); } + const_reverse_iterator rbegin() const { return Vec.rbegin(); } + const_reverse_iterator rend() const { return Vec.rend(); } }; // A wrapper around vector which exposes begin(), end(), rbegin() and rend(). @@ -49,6 +52,29 @@ public: reverse_iterator rend() { return Vec.rend(); } }; +/// This is the same as BidirectionalVector but with the addition of const +/// begin/rbegin methods to ensure that the type traits for has_rbegin works. +class BidirectionalVectorConsts { + std::vector<int> Vec; + +public: + BidirectionalVectorConsts(std::initializer_list<int> list) : Vec(list) {} + + typedef std::vector<int>::iterator iterator; + typedef std::vector<int>::const_iterator const_iterator; + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + typedef std::vector<int>::reverse_iterator reverse_iterator; + typedef std::vector<int>::const_reverse_iterator const_reverse_iterator; + reverse_iterator rbegin() { return Vec.rbegin(); } + reverse_iterator rend() { return Vec.rend(); } + const_reverse_iterator rbegin() const { return Vec.rbegin(); } + const_reverse_iterator rend() const { return Vec.rend(); } +}; + template <typename R> void TestRev(const R &r) { int counter = 3; for (int i : r) @@ -80,4 +106,8 @@ TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) { TestRev(reverse(TypeParam({0, 1, 2, 3}))); } +TYPED_TEST(RangeAdapterRValueTest, HasRbegin) { + EXPECT_TRUE(has_rbegin<TypeParam>::value); +} + } // anonymous namespace |