]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/8230 (Buggy allocator behaviour)
authorBenjamin Kosnik <bkoz@gcc.gnu.org>
Wed, 13 Nov 2002 22:15:17 +0000 (22:15 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Wed, 13 Nov 2002 22:15:17 +0000 (22:15 +0000)
2002-11-13  Benjamin Kosnik  <bkoz@redhat.com>

PR libstdc++/8230
* include/bits/vector.tcc (vector::reserve): Throw length_error if
requested size is bigger than max_size().
* include/bits/stl_bvector.h (vector<bool>::reserve): Same.
* testsuite/23_containers/vector_capacity.cc (test02): Add.

From-SVN: r59090

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_bvector.h
libstdc++-v3/include/bits/vector.tcc
libstdc++-v3/testsuite/23_containers/vector_capacity.cc

index 73ffef2a680dda44bf4854764310ba39fb7d9628..faa6414bd7084d85ffc4d10a925c9a41681dd9c1 100644 (file)
@@ -1,10 +1,18 @@
+2002-11-13  Benjamin Kosnik  <bkoz@redhat.com>
+
+       PR libstdc++/8230
+       * include/bits/vector.tcc (vector::reserve): Throw length_error if
+       requested size is bigger than max_size().
+       * include/bits/stl_bvector.h (vector<bool>::reserve): Same.
+       * testsuite/23_containers/vector_capacity.cc (test02): Add.
+       
 2002-11-13  Benjamin Kosnik  <bkoz@redhat.com>
 
        * config/linker-map.gnu: Export all _S_construct.
 
 2002-11-13  Loren J. Rittle  <ljrittle@acm.org>
 
-       libstdc++/7445
+       PR libstdc++/7445
        * src/locale.cc (std::locale::classic()): Weaken locking protocol.
 
 2002-11-13  Jonathan Wakely  <redi@gcc.gnu.org>
index 59e7b7f967cd8573cf71f6079e8550ab42396cf0..2c97d470582e3588aee8b5c68c3a9a55ea145890 100644 (file)
@@ -604,7 +604,9 @@ template <typename _Alloc>
     }    
   
     void reserve(size_type __n) {
-      if (capacity() < __n) {
+      if (__n > this->max_size())
+       __throw_length_error("vector::reserve");
+      if (this->capacity() < __n) {
         _Bit_type * __q = _M_bit_alloc(__n);
         _M_finish = copy(begin(), end(), iterator(__q, 0));
         _M_deallocate();
index 9b21d0da9fcef752273845b5ff6b65bd92dffed4..4e742dd867233444e480318b5fc1a2412c218f69 100644 (file)
@@ -68,16 +68,18 @@ namespace std
     vector<_Tp,_Alloc>::
     reserve(size_type __n)
     {
-      if (capacity() < __n)
-      {
-        const size_type __old_size = size();
-        pointer __tmp = _M_allocate_and_copy(__n, _M_start, _M_finish);
-        _Destroy(_M_start, _M_finish);
-        _M_deallocate(_M_start, _M_end_of_storage - _M_start);
-        _M_start = __tmp;
-        _M_finish = __tmp + __old_size;
-        _M_end_of_storage = _M_start + __n;
-      }
+      if (__n > this->max_size())
+       __throw_length_error("vector::reserve");
+      if (this->capacity() < __n)
+       {
+         const size_type __old_size = size();
+         pointer __tmp = _M_allocate_and_copy(__n, _M_start, _M_finish);
+         _Destroy(_M_start, _M_finish);
+         _M_deallocate(_M_start, _M_end_of_storage - _M_start);
+         _M_start = __tmp;
+         _M_finish = __tmp + __old_size;
+         _M_end_of_storage = _M_start + __n;
+       }
     }
   
   template <typename _Tp, typename _Alloc>
index a56f2ef40c4d88b966cd82ed51097cdde83d5af1..e73b15a3246876741053bd57cb616f6f761aff07 100644 (file)
@@ -1,7 +1,7 @@
 // 1999-05-07
 // bkoz 
 
-// Copyright (C) 1999 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2002 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -22,6 +22,7 @@
 // 23.2.4.2 vector capacity
 
 #include <vector>
+#include <stdexcept>
 #include <testsuite_hooks.h>
 
 template<typename T>
@@ -29,9 +30,8 @@ template<typename T>
 
 struct B { };
 
-bool test01()
+void test01()
 {
-
   // non POD types
   bool test = true;
   std::vector< A<B> > vec01;
@@ -51,17 +51,57 @@ bool test01()
   vec01.resize(sz01);
   sz02 = vec01.size();
   VERIFY( sz01 == sz02 );
+}
 
-#ifdef DEBUG_ASSERT
-  assert(test);
-#endif
-  
-  return test;
+// libstdc++/8230
+void test02()
+{
+  bool test = true;
+
+  {
+    std::vector<int>  array;
+    const std::size_t size = array.max_size();
+    try 
+      {
+       array.reserve(size);
+      } 
+    catch (const std::length_error& error) 
+      {
+       test &= false;
+      }
+    catch (const std::bad_alloc& error)
+      {
+       test &= true;
+      }
+    catch (...)
+      {
+       test &= false;
+      }
+    VERIFY( test );
+  }
+
+  {
+    std::vector<int>  array;
+    const std::size_t size = array.max_size() + 1;
+    try 
+      {
+       array.reserve(size);
+      } 
+    catch (const std::length_error& error) 
+      {
+       test &= true;
+      }
+    catch (...)
+      {
+       test &= false;
+      }
+    VERIFY( test );
+  }
 }
 
 int main()
 {
   test01();
-
+  test02();
   return 0;
 }