locale_facets.tcc (num_put::_M_insert_float): Do not pass precision when using hexflo...
authorJonathan Wakely <jwakely@redhat.com>
Wed, 8 Oct 2014 13:25:30 +0000 (14:25 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 8 Oct 2014 13:25:30 +0000 (14:25 +0100)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/locale_facets.tcc
libstdc++-v3/src/c++98/locale_facets.cc

index ab082d2503c75df6b4ddaadcee86ada88a3633ab..da92622d7b92e3beb4b5b269b666805ffcd75e59 100644 (file)
@@ -1,3 +1,10 @@
+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
index cf12a084173ac83df7ffdcd4e22d807b66cb96dc..88adc0d9832c090e86af413bee2a41c197d1fa3e 100644 (file)
@@ -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
index 7ed04e613e2eb23f669fc7d992ab76fe78235499..b3ca5dc8c9d872c501aa413fe909fca711fe47a3 100644 (file)
@@ -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++ = '.';