The buffer size (__nbuf) in num_put::do_put is currently not an
integral/core constant expression. As a result, __nar is a Variable Length
Array (VLA). VLAs are a GNU extension and not part of the base C++ standard, so
unless there is good reason to do so they probably shouldn't be used in any of
the standard library headers. The call to __iob.flags() is the only thing
keeping __nbuf from being a compile time constant, so the solution here is to
simply err on the side of caution and always allocate a buffer large enough to
fit the base prefix.
Note that, while the base prefix for hex (0x) is slightly longer than the
base prefix for octal (0), this isn't a concern. The difference in the space
needed for the value portion of the string is enough to make up for this.
(Unless we're working with small, oddly sized types such as a hypothetical
uint9_t, the space needed for the value portion in octal is at least 1 more
than the space needed for the value portion in hex).
This PR also adds constexpr to __nbuf to enforce compile time const-ness
going forward.
I wonder if this should be _LIBCPP_CONSTEXPR const (which seems redundant) or merely static const (for C++03 compatibility) or merely const. But I guess as long as it compiles it's fine any way.