]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libstdc++/19495 (basic_string::_M_rep() can produce an unnaturally aligned...
authorPaolo Carlini <pcarlini@suse.de>
Wed, 18 May 2005 22:11:24 +0000 (22:11 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 18 May 2005 22:11:24 +0000 (22:11 +0000)
2005-05-18  Paolo Carlini  <pcarlini@suse.de>
    Nathan Myers  <ncm@cantrip.org>

PR libstdc++/19495
* include/bits/basic_string.h (_Raw_bytes_alloc): Rebind to
size_type instead of char and rename to _Raw_alloc.
* include/bits/basic_string.tcc (_Rep::_M_destroy, _Rep::_S_create):
Use the above.
* src/bitmap_allocator.cc: Add instantiation for size_type.
* src/mt_allocator.cc: Likewise.
* src/pool_allocator.cc: Likewise.
* include/ext/array_allocator.h: Tweak slightly, avoid assuming
the existence of an _Array::begin() and size() members.
* testsuite/ext/array_allocator/2.cc: Tweak to use an allocator
of size_type, instead of char, thus avoiding problems with
rebinds, not treated correctly by array_allocator.

Co-Authored-By: Nathan Myers <ncm@cantrip.org>
From-SVN: r99933

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/include/bits/basic_string.tcc
libstdc++-v3/include/ext/array_allocator.h
libstdc++-v3/src/bitmap_allocator.cc
libstdc++-v3/src/mt_allocator.cc
libstdc++-v3/src/pool_allocator.cc
libstdc++-v3/testsuite/ext/array_allocator/2.cc

index dfee5d78683e6fffcc37e25c8185157d895e9e01..50db6bb11bf0a7e75aa54f1c8e5b6ee3b2bd0dac 100644 (file)
@@ -1,3 +1,20 @@
+2005-05-18  Paolo Carlini  <pcarlini@suse.de>
+           Nathan Myers  <ncm@cantrip.org>
+
+       PR libstdc++/19495
+       * include/bits/basic_string.h (_Raw_bytes_alloc): Rebind to
+       size_type instead of char and rename to _Raw_alloc.
+       * include/bits/basic_string.tcc (_Rep::_M_destroy, _Rep::_S_create):
+       Use the above.
+       * src/bitmap_allocator.cc: Add instantiation for size_type.
+       * src/mt_allocator.cc: Likewise.
+       * src/pool_allocator.cc: Likewise.
+       * include/ext/array_allocator.h: Tweak slightly, avoid assuming
+       the existence of an _Array::begin() and size() members.
+       * testsuite/ext/array_allocator/2.cc: Tweak to use an allocator
+       of size_type, instead of char, thus avoiding problems with
+       rebinds, not treated correctly by array_allocator.
+
 2005-05-18  Paolo Carlini  <pcarlini@suse.de>
 
        * testsuite/22_locale/ctype/is/char/2.cc: Adjust dg-require-namedlocale.
index d257956a9aed57ca1e30314ab763a58a8c44283f..b1fbaaac4d0837fc19fcc07b5e62d3b7558f1cf7 100644 (file)
@@ -151,7 +151,7 @@ namespace std
       struct _Rep : _Rep_base
       {
        // Types:
-       typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
+       typedef typename _Alloc::template rebind<size_type>::other _Raw_alloc;
 
        // (Public) Data members:
 
index 41db0dff438402135a6796d2aa03b09bdbe2353f..672457f9be9cfcfe8d99148500d84fac384f897f 100644 (file)
@@ -425,9 +425,10 @@ namespace std
     basic_string<_CharT, _Traits, _Alloc>::_Rep::
     _M_destroy(const _Alloc& __a) throw ()
     {
-      const size_type __size = sizeof(_Rep_base) +
-                              (this->_M_capacity + 1) * sizeof(_CharT);
-      _Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
+      const size_type __size = ((this->_M_capacity + 1) * sizeof(_CharT)
+                               + sizeof(_Rep_base) + sizeof(size_type) - 1);
+      _Raw_alloc(__a).deallocate(reinterpret_cast<size_type*>(this), __size
+                                / sizeof(size_type));
     }
 
   template<typename _CharT, typename _Traits, typename _Alloc>
@@ -568,9 +569,12 @@ namespace std
        __capacity = 2 * __old_capacity;
 
       // NB: Need an array of char_type[__capacity], plus a terminating
-      // null char_type() element, plus enough for the _Rep data structure.
+      // null char_type() element, plus enough for the _Rep data structure,
+      // plus sizeof(size_type) - 1 to upper round to a size multiple
+      // of sizeof(size_type).
       // Whew. Seemingly so needy, yet so elemental.
-      size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+      size_type __size = ((__capacity + 1) * sizeof(_CharT) + sizeof(_Rep)
+                         + sizeof(size_type) - 1);
 
       const size_type __adj_size = __size + __malloc_header_size;
       if (__adj_size > __pagesize && __capacity > __old_capacity)
@@ -580,12 +584,14 @@ namespace std
          // Never allocate a string bigger than _S_max_size.
          if (__capacity > _S_max_size)
            __capacity = _S_max_size;
-         __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
+         __size = ((__capacity + 1) * sizeof(_CharT) + sizeof(_Rep)
+                   + sizeof(size_type) - 1);
        }
 
       // NB: Might throw, but no worries about a leak, mate: _Rep()
       // does not throw.
-      void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
+      void* __place = _Raw_alloc(__alloc).allocate(__size
+                                                  / sizeof(size_type));
       _Rep *__p = new (__place) _Rep;
       __p->_M_capacity = __capacity;
       return __p;
index 8689d9da26a6cafc5b840ac0888a2a15b2e4f530..27169193306b5e48f06d2d93418d50b2c406f0e8 100644 (file)
@@ -121,9 +121,10 @@ namespace __gnu_cxx
       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
+           || __array_used + __n > sizeof(*_M_array) / sizeof(_Tp))
          std::__throw_bad_alloc();
-       pointer __ret = _M_array->begin() + __array_used;
+       pointer __ret = reinterpret_cast<_Tp*>(_M_array) + __array_used;
        __array_used += __n;
        return __ret;
       }
index c8d94af21579177ae33749845765be6e251d43b5..4e42cced450b7d69d027fbb361b3e3cb7afa7245 100644 (file)
@@ -41,6 +41,10 @@ namespace __gnu_cxx
     <bitmap_allocator<wchar_t>::_Alloc_block*, 
      bitmap_allocator<wchar_t>::_Alloc_block*> >;
 
+    template class __mini_vector<std::pair
+    <bitmap_allocator<size_t>::_Alloc_block*, 
+     bitmap_allocator<size_t>::_Alloc_block*> >;
+
     template class __mini_vector<size_t*>;
 
     template size_t** __lower_bound
index bb6ab899cafe5d910b97803bb414007025f9ac77..9c94bc860446de867bcec1baee38af465c8a749c 100644 (file)
@@ -1,8 +1,8 @@
 // Allocator details.
 
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
 //
-// This file is part of the GNU ISO C++ Librarbooly.  This library is free
+// 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)
@@ -552,4 +552,5 @@ namespace __gnu_cxx
   // Instantiations.
   template class __mt_alloc<char>;
   template class __mt_alloc<wchar_t>;
+  template class __mt_alloc<size_t>;  
 } // namespace __gnu_cxx
index 731cfffa0ea40110a3d42a306d3e0932bd6f6a2a..1ad4e9c9a45ac668bdeeff3494b1a8f0c5295694 100644 (file)
@@ -170,4 +170,5 @@ namespace __gnu_cxx
   // Instantiations.
   template class __pool_alloc<char>;
   template class __pool_alloc<wchar_t>;
+  template class __pool_alloc<size_t>;  
 } // namespace __gnu_cxx
index f580ea250b7bd09da94a7c8f84e32d4558011098..1e8372589230870f1e012a07f36b227317ed6e47 100644 (file)
@@ -1,7 +1,4 @@
-// Expected execution error for PR19495.
-// { dg-do run { xfail powerpc*-*-linux* } }
-
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 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
 
 typedef char char_type;
 typedef std::char_traits<char_type> traits_type;
-typedef std::tr1::array<char_type, 32> array_type;
+// NB: Array_allocator doesn't properly support rebinding, used by
+// basic_string. See libstdc++/21609 for details.
+typedef std::tr1::array<size_t, 16> array_type;
+typedef __gnu_cxx::array_allocator<size_t, array_type> allocator_type;
 
 array_type extern_array;
 
@@ -44,10 +44,8 @@ void test01()
   bool test __attribute__((unused)) = true;
 
   using std::basic_string;
-  typedef __gnu_cxx::array_allocator<char_type, array_type> allocator_type;
   typedef basic_string<char_type, traits_type, allocator_type> string_type;
 
-  size_t index = array_type::_S_index;
   allocator_type a(&extern_array);
   string_type s(a);