libstdc++: Ensure that std::from_chars is declared when supported
authorJonathan Wakely <jwakely@redhat.com>
Fri, 11 Mar 2022 14:36:18 +0000 (14:36 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 16 Mar 2022 16:06:29 +0000 (16:06 +0000)
commit5a4e208022e7047af3a15a3dedb715ad801db160
treeb90f70e422a851cc62500bd4073b7adce848f5b1
parentbeb12c62eaec37ed0ee5a251ca0907d965d413b2
libstdc++: Ensure that std::from_chars is declared when supported

This adjusts the declarations in <charconv> to match when the definition
is present. This solves the issue that std::from_chars is present on
Solaris 11.3 (using fast_float) but was not declared in the header
(because the declarations were guarded by _GLIBCXX_HAVE_USELOCALE).

Additionally, do not define __cpp_lib_to_chars unless both from_chars
and to_chars are supported (which is only true for IEEE float and
double). We might still provide from_chars (via strtold) but if to_chars
isn't provided, we shouldn't define the feature test macro.

Finally, this simplifies some of the preprocessor checks in the bodies
of std::from_chars in src/c++17/floating_from_chars.cc and hoists the
repeated code for the strtod version into a new function template.

N.B. the long double overload of std::from_chars will always be defined
if the float and double overloads are defined. We can always use one of
strtold or fast_float's binary64 routines (although the latter might
produce errors for some long double values if they are not representable
as binary64).

libstdc++-v3/ChangeLog:

* include/std/charconv (__cpp_lib_to_chars): Only define when
both from_chars and to_chars are supported for floating-point
types.
(from_chars, to_chars): Adjust preprocessor conditions guarding
declarations.
* include/std/version (__cpp_lib_to_chars): Adjust condition to
match <charconv> definition.
* src/c++17/floating_from_chars.cc (from_chars_strtod): New
function template.
(from_chars): Simplify preprocessor checks and use
from_chars_strtod when appropriate.
libstdc++-v3/include/std/charconv
libstdc++-v3/include/std/version
libstdc++-v3/src/c++17/floating_from_chars.cc