]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Implement constexpr std::to_chars for C++23 (P2291R3)
authorJonathan Wakely <jwakely@redhat.com>
Sat, 15 Oct 2022 20:20:47 +0000 (21:20 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Sat, 15 Oct 2022 20:20:47 +0000 (21:20 +0100)
commit378a0f1840e6944d05ed1e374e514abe9564e91a
treeae315fe2b41d8646d66af91f86ccb4bd58054983
parente24b430f1ea60205162fd9b327ac6a4dfc57f37c
libstdc++: Implement constexpr std::to_chars for C++23 (P2291R3)

Some of the helper functions use static constexpr local variables, which
is not permitted in a core constant expression. Removing the 'static'
seems to have negligible performance effect for __to_chars and
__to_chars_16. For __from_chars_alnum_to_val removing the 'static'
causes a significant performance impact for base 36 conversions. Use a
consteval lambda instead.

libstdc++-v3/ChangeLog:

* include/bits/charconv.h (__to_chars_10_impl): Add constexpr
for C++23. Remove 'static' from array.
* include/std/charconv (__cpp_lib_constexpr_charconv): Define.
(__to_chars, __to_chars_16): Remove 'static' from array, add
constexpr.
(__to_chars_10, __to_chars_8, __to_chars_2, __to_chars_i)
(to_chars, __raise_and_add, __from_chars_pow2_base)
(__from_chars_alnum, from_chars): Add constexpr.
(__from_chars_alnum_to_val): Avoid local static during constant
evaluation. Add constexpr.
* include/std/version (__cpp_lib_constexpr_charconv): Define.
* testsuite/20_util/from_chars/constexpr.cc: New test.
* testsuite/20_util/to_chars/constexpr.cc: New test.
* testsuite/20_util/to_chars/version.cc: New test.
libstdc++-v3/include/bits/charconv.h
libstdc++-v3/include/std/charconv
libstdc++-v3/include/std/version
libstdc++-v3/testsuite/20_util/from_chars/constexpr.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/to_chars/constexpr.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/to_chars/version.cc [new file with mode: 0644]