OSDN Git Service

Fix SmallDenseMap assignment operator.
authorAndrew Trick <atrick@apple.com>
Mon, 4 Aug 2014 22:18:25 +0000 (22:18 +0000)
committerAndrew Trick <atrick@apple.com>
Mon, 4 Aug 2014 22:18:25 +0000 (22:18 +0000)
Self assignment would lead to buckets of garbage, causing quadratic probing to hang.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214790 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/DenseMap.h
unittests/ADT/DenseMapTest.cpp

index 85f37b9..c44b67a 100644 (file)
@@ -305,6 +305,7 @@ protected:
 
   template <typename OtherBaseT>
   void copyFrom(const DenseMapBase<OtherBaseT, KeyT, ValueT, KeyInfoT>& other) {
+    assert(&other != this);
     assert(getNumBuckets() == other.getNumBuckets());
 
     setNumEntries(other.getNumEntries());
@@ -574,7 +575,8 @@ public:
   }
 
   DenseMap& operator=(const DenseMap& other) {
-    copyFrom(other);
+    if (&other != this)
+      copyFrom(other);
     return *this;
   }
 
@@ -799,7 +801,8 @@ public:
   }
 
   SmallDenseMap& operator=(const SmallDenseMap& other) {
-    copyFrom(other);
+    if (&other != this)
+      copyFrom(other);
     return *this;
   }
 
index 75a910a..f497983 100644 (file)
@@ -244,6 +244,11 @@ TYPED_TEST(DenseMapTest, AssignmentTest) {
 
   EXPECT_EQ(1u, copyMap.size());
   EXPECT_EQ(this->getValue(), copyMap[this->getKey()]);
+
+  // test self-assignment.
+  copyMap = copyMap;
+  EXPECT_EQ(1u, copyMap.size());
+  EXPECT_EQ(this->getValue(), copyMap[this->getKey()]);
 }
 
 // Test swap method