From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id E54593840C2E; Fri, 31 Jul 2020 15:06:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E54593840C2E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1596207994; bh=upoe0c9kR2/ZdRbTbCWTWUNT3RaYNmZxzczPwWwlxA4=; h=From:To:Subject:Date:From; b=GcuKff+Zgo29OY/7w5V7yvJjLrO9YXUDFDWZwuoLlBAetJMmuRt42IBkoiUmjRii2 XgPuUBsBbB3bLj4iThWfPP9OiGblTtyVjBw9aTl/hKBDg9h9djjbl9v3/KP3Mu2WYL UY60yMGAJZdhUr4WqVTXq2aPd4It741ec/sEJWLs= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testbase)] libstdc++: Check _GLIBCXX_USE_C99_STDLIB for strtof and strtold X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/users/aoliva/heads/testbase X-Git-Oldrev: 357beca8bce179315bdf112c0f1df20ff5874f39 X-Git-Newrev: e513e9aa53121e628e0403438a5bb3861a50c198 Message-Id: <20200731150634.E54593840C2E@sourceware.org> Date: Fri, 31 Jul 2020 15:06:34 +0000 (GMT) X-BeenThere: libstdc++-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 31 Jul 2020 15:06:35 -0000 https://gcc.gnu.org/g:e513e9aa53121e628e0403438a5bb3861a50c198 commit e513e9aa53121e628e0403438a5bb3861a50c198 Author: Jonathan Wakely Date: Thu Jul 30 20:55:56 2020 +0100 libstdc++: Check _GLIBCXX_USE_C99_STDLIB for strtof and strtold On broken systems we only have strtod, not strtof and strtold. Just use strtod for all types, even though that will produce incorrect results in some cases. Similarly, if _GLIBCXX_USE_C99_MATH is not defined then std::isinf won't be declared. Just refer to it unqualified, which should find the C library's isinf macro if that hasn't been #undef'd by . libstdc++-v3/ChangeLog: * src/c++17/floating_from_chars.cc (from_chars_impl): Use isinf unqualified. [!_GLIBCXX_USE_C99_STDLIB]: Use strtod for float and long double. Diff: --- libstdc++-v3/src/c++17/floating_from_chars.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/src/c++17/floating_from_chars.cc b/libstdc++-v3/src/c++17/floating_from_chars.cc index f1519e5c7b6..26b69a38521 100644 --- a/libstdc++-v3/src/c++17/floating_from_chars.cc +++ b/libstdc++-v3/src/c++17/floating_from_chars.cc @@ -300,12 +300,16 @@ namespace errno = 0; char* endptr; T tmpval; +#if _GLIBCXX_USE_C99_STDLIB if constexpr (is_same_v) tmpval = std::strtof(str, &endptr); - if constexpr (is_same_v) + else if constexpr (is_same_v) tmpval = std::strtod(str, &endptr); else if constexpr (is_same_v) tmpval = std::strtold(str, &endptr); +#else + tmpval = std::strtod(str, &endptr); +#endif const int conv_errno = std::__exchange(errno, save_errno); #if _GLIBCXX_USE_C99_FENV_TR1 @@ -319,7 +323,7 @@ namespace const ptrdiff_t n = endptr - str; if (conv_errno == ERANGE) [[unlikely]] { - if (std::isinf(tmpval)) // overflow + if (isinf(tmpval)) // overflow ec = errc::result_out_of_range; else // underflow (LWG 3081 wants to set value = tmpval here) ec = errc::result_out_of_range;