From 28332c415c323d3d7db1031bd39f62498f18486e Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Mon, 15 Oct 2018 18:34:36 +0000 Subject: [PATCH] [ADT] Fix a bug in DenseSet's initializer_list constructor. Without this fix, DenseSet crashes with an assertion if constructed with an initializer_list whose length is not a power of two. llvm-svn: 344542 --- llvm/include/llvm/ADT/DenseSet.h | 3 ++- llvm/unittests/ADT/DenseSetTest.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/ADT/DenseSet.h b/llvm/include/llvm/ADT/DenseSet.h index 404b2f7..e85a385 100644 --- a/llvm/include/llvm/ADT/DenseSet.h +++ b/llvm/include/llvm/ADT/DenseSet.h @@ -16,6 +16,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseMapInfo.h" +#include "llvm/Support/MathExtras.h" #include "llvm/Support/type_traits.h" #include #include @@ -67,7 +68,7 @@ public: explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {} DenseSetImpl(std::initializer_list Elems) - : DenseSetImpl(Elems.size()) { + : DenseSetImpl(PowerOf2Ceil(Elems.size())) { insert(Elems.begin(), Elems.end()); } diff --git a/llvm/unittests/ADT/DenseSetTest.cpp b/llvm/unittests/ADT/DenseSetTest.cpp index 04f84e0..7368e2e 100644 --- a/llvm/unittests/ADT/DenseSetTest.cpp +++ b/llvm/unittests/ADT/DenseSetTest.cpp @@ -80,6 +80,14 @@ TYPED_TEST(DenseSetTest, InitializerList) { EXPECT_EQ(0u, set.count(3)); } +TYPED_TEST(DenseSetTest, InitializerListWithNonPowerOfTwoLength) { + TypeParam set({1, 2, 3}); + EXPECT_EQ(3u, set.size()); + EXPECT_EQ(1u, set.count(1)); + EXPECT_EQ(1u, set.count(2)); + EXPECT_EQ(1u, set.count(3)); +} + TYPED_TEST(DenseSetTest, ConstIteratorComparison) { TypeParam set({1}); const TypeParam &cset = set; -- 2.7.4