Avoid undefined behavior in DenseMap::shrink_and_clear(). Log2_32_Ceil(0)
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 14 Aug 2012 02:56:51 +0000 (02:56 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 14 Aug 2012 02:56:51 +0000 (02:56 +0000)
returns 32. This change mirrors the corresponding code in
SmallDenseMap::shrink_and_clear().

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

include/llvm/ADT/DenseMap.h

index d502be65a78d87c7ebd6529096ffeed40fd378f7..65a70fbfa6d0e194e9f2da4b0aa32e2324c8df6d 100644 (file)
@@ -617,8 +617,9 @@ public:
     this->destroyAll();
 
     // Reduce the number of buckets.
-    unsigned NewNumBuckets
-      = std::max(64, 1 << (Log2_32_Ceil(OldNumEntries) + 1));
+    unsigned NewNumBuckets = 0;
+    if (OldNumEntries)
+      NewNumBuckets = std::max(64, 1 << (Log2_32_Ceil(OldNumEntries) + 1));
     if (NewNumBuckets == NumBuckets) {
       this->BaseT::initEmpty();
       return;