re PR libstdc++/26875 (Array allocator use count is shared between array_allocator...
authorBenjamin Kosnik <bkoz@redhat.com>
Wed, 26 Apr 2006 19:52:31 +0000 (19:52 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Wed, 26 Apr 2006 19:52:31 +0000 (19:52 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/array_allocator.h
libstdc++-v3/testsuite/ext/array_allocator/26875.cc [new file with mode: 0644]

index e98e4b59f0f7a28ba7971c03b5e94f1b4ac677b5..5f26d32ad831d28d02d3c24cbd50226a4581385c 100644 (file)
@@ -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
index d7e9670d227083d37a24db58cb410762a565ca33..08661864c2a5071011557de261994d8a4fef07c1 100644 (file)
@@ -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 (file)
index 0000000..c641866
--- /dev/null
@@ -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;
+}
+