diff --git a/llvm/include/llvm/ADT/SmallPtrSet.h b/llvm/include/llvm/ADT/SmallPtrSet.h index 57dd8f6b695d..981b741669b0 100644 --- a/llvm/include/llvm/ADT/SmallPtrSet.h +++ b/llvm/include/llvm/ADT/SmallPtrSet.h @@ -366,6 +366,13 @@ public: return std::make_pair(makeIterator(p.first), p.second); } + /// Insert the given pointer with an iterator hint that is ignored. This is + /// identical to calling insert(Ptr), but allows SmallPtrSet to be used by + /// std::insert_iterator and std::inserter(). + iterator insert(iterator, PtrType Ptr) { + return insert(Ptr).first; + } + /// erase - If the set contains the specified pointer, remove it and return /// true, otherwise return false. bool erase(PtrType Ptr) { diff --git a/llvm/unittests/ADT/SmallPtrSetTest.cpp b/llvm/unittests/ADT/SmallPtrSetTest.cpp index eacd62ffc6ff..6f3c94eed273 100644 --- a/llvm/unittests/ADT/SmallPtrSetTest.cpp +++ b/llvm/unittests/ADT/SmallPtrSetTest.cpp @@ -395,3 +395,16 @@ TEST(SmallPtrSetTest, Contains) { EXPECT_TRUE(Set.contains(&buf[1])); EXPECT_TRUE(Set.contains(&buf[2])); } + +TEST(SmallPtrSetTest, InsertIterator) { + SmallPtrSet Set; + int Vals[5] = {11, 22, 33, 44, 55}; + int *Buf[5] = {&Vals[0], &Vals[1], &Vals[2], &Vals[3], &Vals[4]}; + + for (int *Ptr : Buf) + Set.insert(Set.begin(), Ptr); + + // Ensure that all of the values were copied into the set. + for (const auto *Ptr : Buf) + EXPECT_TRUE(Set.contains(Ptr)); +}