aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@gcc.gnu.org>2002-11-13 22:15:17 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2002-11-13 22:15:17 +0000
commit48d1c3c568c1417b86ed9e23f48c5d4344a2d096 (patch)
tree34209be2f1268c7cac587baa4d7ec94537df451b
parent1a083c0e90c3b466525ad1d31fb9e7af542da55c (diff)
downloadgcc-48d1c3c568c1417b86ed9e23f48c5d4344a2d096.zip
gcc-48d1c3c568c1417b86ed9e23f48c5d4344a2d096.tar.gz
gcc-48d1c3c568c1417b86ed9e23f48c5d4344a2d096.tar.bz2
re PR libstdc++/8230 (Buggy allocator behaviour)
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
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h4
-rw-r--r--libstdc++-v3/include/bits/vector.tcc22
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector_capacity.cc58
4 files changed, 73 insertions, 21 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 73ffef2..faa6414 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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>
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index 59e7b7f..2c97d47 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -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();
diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc
index 9b21d0d..4e742dd 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -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>
diff --git a/libstdc++-v3/testsuite/23_containers/vector_capacity.cc b/libstdc++-v3/testsuite/23_containers/vector_capacity.cc
index a56f2ef..e73b15a 100644
--- a/libstdc++-v3/testsuite/23_containers/vector_capacity.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector_capacity.cc
@@ -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;
}