re PR target/64368 (Several libstdc++ test failures on non-linux platforms after...
authorJonathan Wakely <jwakely@redhat.com>
Mon, 26 Jan 2015 23:42:39 +0000 (23:42 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 26 Jan 2015 23:42:39 +0000 (23:42 +0000)
PR libstdc++/64368
* config/locale/gnu/numeric_members.cc (numpunct<char>::~numpunct(),
numpunct<wchar_t>::~numpunct()): Do not set _M_data->_M_grouping.
* src/c++11/cxx11-shim_facets.cc (numpunct_shim): Remove _M_grouping
and use cache's _M_grouping field.
(__numpunct_fill_cache): Likewise.
(__moneypunct_fill_cache): Improve comments.

From-SVN: r220143

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/gnu/numeric_members.cc
libstdc++-v3/src/c++11/cxx11-shim_facets.cc

index 6b2124a37b8ead92409f2f6caed39758153ab7d9..4cdcd148abd66cfba732fd85515f42bd2c60fcbc 100644 (file)
@@ -1,3 +1,13 @@
+2015-01-26  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/64368
+       * config/locale/gnu/numeric_members.cc (numpunct<char>::~numpunct(),
+       numpunct<wchar_t>::~numpunct()): Do not set _M_data->_M_grouping.
+       * src/c++11/cxx11-shim_facets.cc (numpunct_shim): Remove _M_grouping
+       and use cache's _M_grouping field.
+       (__numpunct_fill_cache): Likewise.
+       (__moneypunct_fill_cache): Improve comments.
+
 2015-01-26  Jonathan Wakely  <jwakely@redhat.com>
 
        * testsuite/23_containers/set/operations/2.cc: Add test for
index 919a5c6e3dccf252b5222b20b8b40b887e860e55..aab01f9c263c4da191d4603628ec9f3752fd5d1d 100644 (file)
@@ -117,7 +117,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       if (_M_data->_M_grouping_size)
        delete [] _M_data->_M_grouping;
-      _M_data->_M_grouping = 0;
       delete _M_data;
     }
    
@@ -210,7 +209,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
       if (_M_data->_M_grouping_size)
        delete [] _M_data->_M_grouping;
-      _M_data->_M_grouping = 0;
       delete _M_data;
     }
  #endif
index 407b7b9f921136961d46de1d2e02a674d0786f51..82bdf6f2ced3d4b319f493a0af4134dd66498d49 100644 (file)
@@ -170,8 +170,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<typename C>
     void
-    __numpunct_fill_cache(other_abi, const facet*, __numpunct_cache<C>*,
-                         const char*&, size_t&);
+    __numpunct_fill_cache(other_abi, const facet*, __numpunct_cache<C>*);
 
   template<typename C>
     int
@@ -235,24 +234,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        numpunct_shim(const facet* f, __cache_type* c = new __cache_type)
        : std::numpunct<_CharT>(c), __shim(f), _M_cache(c)
        {
-         __numpunct_fill_cache(other_abi{}, f, c, _M_grouping,
-                               _M_grouping_size);
+         __numpunct_fill_cache(other_abi{}, f, c);
        }
 
-       ~numpunct_shim() { delete[] _M_grouping; }
-
-       virtual string
-       do_grouping() const
-       { return string(_M_grouping, _M_grouping_size); }
+       ~numpunct_shim()
+       {
+         // Stop GNU locale's ~numpunct() from freeing the cached string.
+         _M_cache->_M_grouping_size = 0;
+       }
 
-       // No need to override other virtual functions, the base definitions
+       // No need to override any virtual functions, the base definitions
        // will return the cached data.
 
        __cache_type* _M_cache;
-       // numpunct uses __numpunct_cache<C>::_M_grouping for its own purposes
-       // so we can't store that in the cache
-       const char* _M_grouping;
-       size_t _M_grouping_size;
       };
 
     template<typename _CharT>
@@ -348,7 +342,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
        ~moneypunct_shim()
        {
-         // stop GNU locale's ~moneypunct() from freeing these strings
+         // Stop GNU locale's ~moneypunct() from freeing the cached strings.
          _M_cache->_M_grouping_size = 0;
          _M_cache->_M_curr_symbol_size = 0;
          _M_cache->_M_positive_sign_size = 0;
@@ -497,37 +491,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   // Now define and instantiate the functions that will be called by the
   // shim facets defined when this file is recompiled for the other ABI.
 
+  // Cache the values returned by the numpunct facet f.
+  // Sets c->_M_allocated so that the __numpunct_cache destructor will
+  // delete[] the strings allocated by this function.
   template<typename C>
     void
-    __numpunct_fill_cache(current_abi, const facet* f, __numpunct_cache<C>* c,
-                         const char*& grouping, size_t& grouping_size)
+    __numpunct_fill_cache(current_abi, const facet* f, __numpunct_cache<C>* c)
     {
       auto* m = static_cast<const numpunct<C>*>(f);
 
       c->_M_decimal_point = m->decimal_point();
       c->_M_thousands_sep = m->thousands_sep();
 
+      c->_M_grouping = nullptr;
       c->_M_truename = nullptr;
       c->_M_falsename = nullptr;
       // set _M_allocated so that if any allocation fails the previously
-      // allocated strings will be deleted in ~__numpunct_c()
+      // allocated strings will be deleted in ~__numpunct_cache()
       c->_M_allocated = true;
 
+      c->_M_grouping_size = __copy(c->_M_grouping, m->grouping());
       c->_M_truename_size = __copy(c->_M_truename, m->truename());
       c->_M_falsename_size = __copy(c->_M_falsename, m->falsename());
-      // Set grouping last as it is only deleted by ~numpunct_shim() which
-      // won't run if this function throws an exception.
-      grouping_size = __copy(grouping, m->grouping());
     }
 
   template void
-  __numpunct_fill_cache(current_abi, const facet*, __numpunct_cache<char>*,
-                       const char*&, size_t&);
+  __numpunct_fill_cache(current_abi, const facet*, __numpunct_cache<char>*);
 
 #ifdef _GLIBCXX_USE_WCHAR_T
   template void
-  __numpunct_fill_cache(current_abi, const facet*, __numpunct_cache<wchar_t>*,
-                       const char*&, size_t&);
+  __numpunct_fill_cache(current_abi, const facet*, __numpunct_cache<wchar_t>*);
 #endif
 
   template<typename C>
@@ -567,6 +560,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                      const wchar_t*, const wchar_t*);
 #endif
 
+  // Cache the values returned by the moneypunct facet, f.
+  // Sets c->_M_allocated so that the __moneypunct_cache destructor will
+  // delete[] the strings allocated by this function.
   template<typename C, bool Intl>
     void
     __moneypunct_fill_cache(current_abi, const facet* f,
@@ -582,8 +578,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       c->_M_curr_symbol = nullptr;
       c->_M_positive_sign = nullptr;
       c->_M_negative_sign = nullptr;
-      // set _M_allocated so that if any allocation fails the previously
-      // allocated strings will be deleted in ~__moneypunct_c()
+      // Set _M_allocated so that if any allocation fails the previously
+      // allocated strings will be deleted in ~__moneypunct_cache().
       c->_M_allocated = true;
 
       c->_M_grouping_size = __copy(c->_M_grouping, m->grouping());