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) {