[all-commits] [llvm/llvm-project] ee2a92: [libcxx] Remove VLA from libcxx locale header

DanielMcIntosh-IBM via All-commits all-commits at lists.llvm.org
Tue Jun 8 10:59:55 PDT 2021


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: ee2a92c29df6d37a4dc5d0f6795f0fe531962b9d
      https://github.com/llvm/llvm-project/commit/ee2a92c29df6d37a4dc5d0f6795f0fe531962b9d
  Author: Daniel McIntosh <Daniel.McIntosh at ibm.com>
  Date:   2021-06-08 (Tue, 08 Jun 2021)

  Changed paths:
    M libcxx/include/locale

  Log Message:
  -----------
  [libcxx] Remove VLA from libcxx locale header

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.

Reviewed By: Mordante, #libc, Quuxplusone, ldionne

Differential Revision: https://reviews.llvm.org/D103558




More information about the All-commits mailing list