Bugfixes for smallvector when the element size is small and N is small.
authorChris Lattner <sabre@nondot.org>
Wed, 16 Aug 2006 01:23:31 +0000 (01:23 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 16 Aug 2006 01:23:31 +0000 (01:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29720 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/SmallVector.h

index ae258846e74c0c7e4d048663e1e0502679f7ea8b..66e268cf0466b56a3e26551a4aaac2db98f7750c 100644 (file)
@@ -228,17 +228,30 @@ class SmallVector : public SmallVectorImpl<T> {
   /// InlineElts - These are 'N-1' elements that are stored inline in the body
   /// of the vector.  The extra '1' element is stored in SmallVectorImpl.
   typedef typename SmallVectorImpl<T>::U U;
-  U InlineElts[(sizeof(T)*N+sizeof(U)-1)/sizeof(U) - 1];
+  enum {
+    // MinUs - The number of U's require to cover N T's.
+    MinUs = (sizeof(T)*N+sizeof(U)-1)/sizeof(U),
+    
+    // NumInlineEltsElts - The number of elements actually in this array.  There
+    // is already one in the parent class, and we have to round up to avoid
+    // having a zero-element array.
+    NumInlineEltsElts = (MinUs - 1) > 0 ? (MinUs - 1) : 1,
+    
+    // NumTsAvailable - The number of T's we actually have space for, which may
+    // be more than N due to rounding.
+    NumTsAvailable = (NumInlineEltsElts+1)*sizeof(U) / sizeof(T)
+  };
+  U InlineElts[NumInlineEltsElts];
 public:  
-  SmallVector() : SmallVectorImpl<T>(N) {
+  SmallVector() : SmallVectorImpl<T>(NumTsAvailable) {
   }
   
   template<typename ItTy>
-  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
+  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(NumTsAvailable) {
     append(S, E);
   }
   
-  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
+  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(NumTsAvailable) {
     operator=(RHS);
   }
 };