PR libstdc++/68737 Do not use vsnprintf on HPUX
authorJonathan Wakely <jwakely@redhat.com>
Mon, 28 Jan 2019 23:58:57 +0000 (23:58 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 28 Jan 2019 23:58:57 +0000 (23:58 +0000)
It doesn't conform to the spec, so use vsprintf with a large buffer
instead.

PR libstdc++/68737
* config/locale/generic/c_locale.h (__convert_from_v)
[_GLIBCXX_USE_C99_STDIO]: Also check _GLIBCXX_HAVE_BROKEN_VSNPRINTF.
* config/os/hpux/os_defines.h: Define _GLIBCXX_HAVE_BROKEN_VSNPRINTF.
* include/bits/locale_facets.tcc (num_put::_M_insert_float)
[_GLIBCXX_USE_C99_STDIO]: Also check _GLIBCXX_HAVE_BROKEN_VSNPRINTF.

From-SVN: r268350

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/generic/c_locale.h
libstdc++-v3/config/os/hpux/os_defines.h
libstdc++-v3/include/bits/locale_facets.tcc

index 7a1deca18cb85b45fc40c7501db6f18c0bb1b451..89b94a88ccefd758a8856a09e2359cc4a8e3fa26 100644 (file)
@@ -1,3 +1,12 @@
+2019-01-28  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/68737
+       * config/locale/generic/c_locale.h (__convert_from_v)
+       [_GLIBCXX_USE_C99_STDIO]: Also check _GLIBCXX_HAVE_BROKEN_VSNPRINTF.
+       * config/os/hpux/os_defines.h: Define _GLIBCXX_HAVE_BROKEN_VSNPRINTF.
+       * include/bits/locale_facets.tcc (num_put::_M_insert_float)
+       [_GLIBCXX_USE_C99_STDIO]: Also check _GLIBCXX_HAVE_BROKEN_VSNPRINTF.
+
 2019-01-24  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/88840
index 3b95a43160ee5cef28c6f2625793c02ef40278ae..625a61c8bb2f4dc1451a634d1c7cbe262c3a2080 100644 (file)
@@ -70,7 +70,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     __builtin_va_list __args;
     __builtin_va_start(__args, __fmt);
 
-#if _GLIBCXX_USE_C99_STDIO
+#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF
     const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
 #else
     const int __ret = __builtin_vsprintf(__out, __fmt, __args);
index 04834b0cd0c9c5f2051b8dff182ce0befb7c26bb..20a8b3ed30b28aee1c9e0391408ba156b557cc8c 100644 (file)
@@ -109,4 +109,9 @@ typedef long int __padding_type;
 #if defined (__hppa__)
 #define _GLIBCXX_HAVE_BROKEN_STRTOLD 1
 #endif
+
+// The vnsprintf function returns -1 when the buffer is too small.
+// See PR libstdc++/68737.
+#define _GLIBCXX_HAVE_BROKEN_VSNPRINTF 1
+
 #endif
index c387fdfdbfb01ebeed6557a0ad16faa068e1dc47..2eb8167db9a1f8978e9d928ca27d87acbcbf317f 100644 (file)
@@ -992,7 +992,7 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL
        char __fbuf[16];
        __num_base::_S_format_float(__io, __fbuf, __mod);
 
-#if _GLIBCXX_USE_C99_STDIO
+#if _GLIBCXX_USE_C99_STDIO && !_GLIBCXX_HAVE_BROKEN_VSNPRINTF
        // Precision is always used except for hexfloat format.
        const bool __use_prec =
          (__io.flags() & ios_base::floatfield) != ios_base::floatfield;