diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2014-10-08 14:25:30 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2014-10-08 14:25:30 +0100 |
commit | 9d07d890e6542570950e1b0bbbb231fac3249774 (patch) | |
tree | fe473af6016acce12d3c93426a3c5e0deaa6cc04 /libstdc++-v3 | |
parent | c168f180720f857ef66ae9d23a27859afd1baa9a (diff) | |
download | gcc-9d07d890e6542570950e1b0bbbb231fac3249774.zip gcc-9d07d890e6542570950e1b0bbbb231fac3249774.tar.gz gcc-9d07d890e6542570950e1b0bbbb231fac3249774.tar.bz2 |
locale_facets.tcc (num_put::_M_insert_float): Do not pass precision when using hexfloat format.
* include/bits/locale_facets.tcc (num_put::_M_insert_float): Do not
pass precision when using hexfloat format.
* src/c++98/locale_facets.cc (__num_base::_S_format_float): Always
output precision if C99 hexfloat conversion specifiers not available.
From-SVN: r216001
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_facets.tcc | 20 | ||||
-rw-r--r-- | libstdc++-v3/src/c++98/locale_facets.cc | 3 |
3 files changed, 26 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ab082d2..da92622 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2014-10-08 Jonathan Wakely <jwakely@redhat.com> + * include/bits/locale_facets.tcc (num_put::_M_insert_float): Do not + pass precision when using hexfloat format. + * src/c++98/locale_facets.cc (__num_base::_S_format_float): Always + output precision if C99 hexfloat conversion specifiers not available. + +2014-10-08 Jonathan Wakely <jwakely@redhat.com> + * include/bits/regex.h (regex_token_iterator::_M_end_of_seq): Add const qualifier. diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index cf12a08..88adc0d 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -988,20 +988,32 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL __num_base::_S_format_float(__io, __fbuf, __mod); #ifdef _GLIBCXX_USE_C99 + // Precision is always used except for hexfloat format. + const bool __use_prec = + (__io.flags() & ios_base::floatfield) != ios_base::floatfield; + // First try a buffer perhaps big enough (most probably sufficient // for non-ios_base::fixed outputs) int __cs_size = __max_digits * 3; char* __cs = static_cast<char*>(__builtin_alloca(__cs_size)); - __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, - __fbuf, __prec, __v); + if (__use_prec) + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __prec, __v); + else + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __v); // If the buffer was not large enough, try again with the correct size. if (__len >= __cs_size) { __cs_size = __len + 1; __cs = static_cast<char*>(__builtin_alloca(__cs_size)); - __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, - __fbuf, __prec, __v); + if (__use_prec) + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __prec, __v); + else + __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size, + __fbuf, __v); } #else // Consider the possibility of long ios_base::fixed outputs diff --git a/libstdc++-v3/src/c++98/locale_facets.cc b/libstdc++-v3/src/c++98/locale_facets.cc index 7ed04e6..b3ca5dc 100644 --- a/libstdc++-v3/src/c++98/locale_facets.cc +++ b/libstdc++-v3/src/c++98/locale_facets.cc @@ -71,7 +71,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ios_base::fmtflags __fltfield = __flags & ios_base::floatfield; +#ifdef _GLIBCXX_USE_C99 + // Precision is always used except for hexfloat format. if (__fltfield != (ios_base::fixed | ios_base::scientific)) +#endif { // As per DR 231: not only when __flags & ios_base::fixed || __prec > 0 *__fptr++ = '.'; |