https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68737

--- Comment #16 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Yes I've just realised that passing 0 was a red herring, because we take the 
#if _GLIBCXX_USE_C99_STDIO branch. Sorry.

I don't think __cs_size + 1 will be enough in general. There's no reason to
think it's only 1 byte too small.

Maybe we need a kluge like:

--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -1008,6 +1008,20 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL
          __len = std::__convert_from_v(_S_get_c_locale(), __cs, __cs_size,
                                        __fbuf, __v);

+#ifdef __hpux
+       while (__len == -1 && __cs_size < 1024)
+         {
+           __cs_size *= 2;
+           char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
+           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);
+         }
+#endif
+
        // If the buffer was not large enough, try again with the correct size.
        if (__len >= __cs_size)
          {

Reply via email to