aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2015-01-26 23:42:39 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2015-01-26 23:42:39 +0000
commit831a3a9e343d66a4dc51c141f2b5a87df5433627 (patch)
tree8b24d20bd9c8aeceb722af8fe96b6b620d94be71
parent26570a9b4bd111cd57f2148f4996e50c2ae812b1 (diff)
downloadgcc-831a3a9e343d66a4dc51c141f2b5a87df5433627.zip
gcc-831a3a9e343d66a4dc51c141f2b5a87df5433627.tar.gz
gcc-831a3a9e343d66a4dc51c141f2b5a87df5433627.tar.bz2
re PR target/64368 (Several libstdc++ test failures on non-linux platforms after r218964.)
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
-rw-r--r--libstdc++-v3/ChangeLog10
-rw-r--r--libstdc++-v3/config/locale/gnu/numeric_members.cc2
-rw-r--r--libstdc++-v3/src/c++11/cxx11-shim_facets.cc50
3 files changed, 33 insertions, 29 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6b2124a..4cdcd14 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,15 @@
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
non-transparent comparison function.
diff --git a/libstdc++-v3/config/locale/gnu/numeric_members.cc b/libstdc++-v3/config/locale/gnu/numeric_members.cc
index 919a5c6..aab01f9c 100644
--- a/libstdc++-v3/config/locale/gnu/numeric_members.cc
+++ b/libstdc++-v3/config/locale/gnu/numeric_members.cc
@@ -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
diff --git a/libstdc++-v3/src/c++11/cxx11-shim_facets.cc b/libstdc++-v3/src/c++11/cxx11-shim_facets.cc
index 407b7b9..82bdf6f 100644
--- a/libstdc++-v3/src/c++11/cxx11-shim_facets.cc
+++ b/libstdc++-v3/src/c++11/cxx11-shim_facets.cc
@@ -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());