aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorBenjamin Kosnik <bkoz@redhat.com>2006-04-26 19:52:31 +0000
committerBenjamin Kosnik <bkoz@gcc.gnu.org>2006-04-26 19:52:31 +0000
commit0c092147be441279c0652a2131a75c3ffe55112c (patch)
tree3eb6e5d9da4dbe26d2f53a0a9d61133e11a0a16e /libstdc++-v3
parent0c3f35451c3fe2072fb918c1387167d996dfd1fe (diff)
downloadgcc-0c092147be441279c0652a2131a75c3ffe55112c.zip
gcc-0c092147be441279c0652a2131a75c3ffe55112c.tar.gz
gcc-0c092147be441279c0652a2131a75c3ffe55112c.tar.bz2
re PR libstdc++/26875 (Array allocator use count is shared between array_allocator instances)
2006-04-26 Benjamin Kosnik <bkoz@redhat.com> PR libstdc++/26875 * include/ext/array_allocator.h (array_allocator): _M_used, new data member. * testsuite/ext/array_allocator/26875.cc: New. From-SVN: r113283
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/ext/array_allocator.h56
-rw-r--r--libstdc++-v3/testsuite/ext/array_allocator/26875.cc46
3 files changed, 81 insertions, 28 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index e98e4b5..5f26d32 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2006-04-26 Benjamin Kosnik <bkoz@redhat.com>
+
+ PR libstdc++/26875
+ * include/ext/array_allocator.h (array_allocator): _M_used, new
+ data member.
+ * testsuite/ext/array_allocator/26875.cc: New.
+
2006-04-26 Shantonu Sen <ssen@opendarwin.org>
PR libstdc++/26513
diff --git a/libstdc++-v3/include/ext/array_allocator.h b/libstdc++-v3/include/ext/array_allocator.h
index d7e9670..0866186 100644
--- a/libstdc++-v3/include/ext/array_allocator.h
+++ b/libstdc++-v3/include/ext/array_allocator.h
@@ -1,6 +1,6 @@
// array allocator -*- C++ -*-
-// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005, 2006 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
@@ -49,13 +49,13 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
class array_allocator_base
{
public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
pointer
address(reference __x) const { return &__x; }
@@ -91,43 +91,43 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
class array_allocator : public array_allocator_base<_Tp>
{
public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef _Tp value_type;
-
- typedef _Array array_type;
-
- array_type* _M_array;
-
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+ typedef _Tp value_type;
+ typedef _Array array_type;
+
+ private:
+ array_type* _M_array;
+ size_type _M_used;
+
+ public:
template<typename _Tp1, typename _Array1 = _Array>
struct rebind
{ typedef array_allocator<_Tp1, _Array1> other; };
array_allocator(array_type* __array = NULL) throw()
- : _M_array(__array)
- { }
+ : _M_array(__array), _M_used(size_type()) { }
array_allocator(const array_allocator& __o) throw()
- : _M_array(__o._M_array) { }
+ : _M_array(__o._M_array), _M_used(__o._M_used) { }
template<typename _Tp1, typename _Array1>
array_allocator(const array_allocator<_Tp1, _Array1>&) throw()
- : _M_array(NULL) { }
+ : _M_array(NULL), _M_used(size_type()) { }
~array_allocator() throw() { }
pointer
allocate(size_type __n, const void* = 0)
{
- static size_type __array_used;
- if (_M_array == 0 || __array_used + __n > _M_array->size())
+ if (_M_array == 0 || _M_used + __n > _M_array->size())
std::__throw_bad_alloc();
- pointer __ret = _M_array->begin() + __array_used;
- __array_used += __n;
+ pointer __ret = _M_array->begin() + _M_used;
+ _M_used += __n;
return __ret;
}
};
diff --git a/libstdc++-v3/testsuite/ext/array_allocator/26875.cc b/libstdc++-v3/testsuite/ext/array_allocator/26875.cc
new file mode 100644
index 0000000..c641866
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/array_allocator/26875.cc
@@ -0,0 +1,46 @@
+//
+// Copyright (C) 2006 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+#include <ext/array_allocator.h>
+
+// libstdc++/26875
+int main()
+{
+ typedef std::tr1::array<int, 1> array_type;
+ array_type Array1;
+ array_type Array2;
+
+ typedef __gnu_cxx::array_allocator<int> allocator_type;
+ allocator_type Allocator1(&Array1);
+ allocator_type Allocator2(&Array2);
+
+ try
+ {
+ Allocator1.allocate(1);
+ Allocator2.allocate(1);
+ }
+ catch (std::bad_alloc& ex)
+ {
+ // fail, rethrow
+ throw;
+ }
+
+ return 0;
+}
+