diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-07-21 16:06:26 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-07-21 16:06:26 +0000 |
commit | 630be14ac646ee919f7d68572716d64ab471b0d8 (patch) | |
tree | d0f5ec903ba3fe66989d32da20f21e9d2ff6224e /llvm/unittests/ADT/BitVectorTest.cpp | |
parent | d7504a1569dfd55db2e0314b3aef87df1f527e8d (diff) | |
download | bcm5719-llvm-630be14ac646ee919f7d68572716d64ab471b0d8.tar.gz bcm5719-llvm-630be14ac646ee919f7d68572716d64ab471b0d8.zip |
[SmallBitVector] Fix bug in find_next_unset for small types with indices >=32
We were creating a bitmask from a shift of unsigned instead of uintptr_t, meaning we couldn't create masks for indices above 31.
Noticed due to a MSVC analyzer warning.
llvm-svn: 366657
Diffstat (limited to 'llvm/unittests/ADT/BitVectorTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/BitVectorTest.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp index 559dcc579d1..fea58422c5f 100644 --- a/llvm/unittests/ADT/BitVectorTest.cpp +++ b/llvm/unittests/ADT/BitVectorTest.cpp @@ -228,6 +228,38 @@ TYPED_TEST(BitVectorTest, SimpleFindOpsMultiWord) { EXPECT_EQ(99, A.find_next_unset(98)); } +// Test finding next set and unset bits in a BitVector/SmallBitVector within a +// uintptr_t - check both 32-bit (Multi) and 64-bit (Small) targets. +TYPED_TEST(BitVectorTest, SimpleFindOps64Bit) { + TypeParam A; + + A.resize(57); + A.set(12); + A.set(13); + A.set(47); + + EXPECT_EQ(47, A.find_last()); + EXPECT_EQ(12, A.find_first()); + EXPECT_EQ(13, A.find_next(12)); + EXPECT_EQ(47, A.find_next(13)); + EXPECT_EQ(-1, A.find_next(47)); + + EXPECT_EQ(-1, A.find_prev(12)); + EXPECT_EQ(12, A.find_prev(13)); + EXPECT_EQ(13, A.find_prev(47)); + EXPECT_EQ(47, A.find_prev(56)); + + EXPECT_EQ(0, A.find_first_unset()); + EXPECT_EQ(56, A.find_last_unset()); + EXPECT_EQ(14, A.find_next_unset(11)); + EXPECT_EQ(14, A.find_next_unset(12)); + EXPECT_EQ(14, A.find_next_unset(13)); + EXPECT_EQ(16, A.find_next_unset(15)); + EXPECT_EQ(48, A.find_next_unset(46)); + EXPECT_EQ(48, A.find_next_unset(47)); + EXPECT_EQ(-1, A.find_next_unset(56)); +} + // Check if a SmallBitVector is in small mode. This check is used in tests // that run for both SmallBitVector and BitVector. This check doesn't apply // to BitVector so we provide an overload that returns true to get the tests |