public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6648] libstdc++: Adjust fast_float's over/underflow behavior for conformance
@ 2022-01-17 19:33 Patrick Palka
  0 siblings, 0 replies; only message in thread
From: Patrick Palka @ 2022-01-17 19:33 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:40b0d4472a2591cf27f3a81aa3fba57dc4532648

commit r12-6648-g40b0d4472a2591cf27f3a81aa3fba57dc4532648
Author: Patrick Palka <ppalka@redhat.com>
Date:   Mon Jan 17 14:32:30 2022 -0500

    libstdc++: Adjust fast_float's over/underflow behavior for conformance
    
    This changes fast_float's handling of overflow/underflow to be
    consistent with the standard: instead of returning errc{} and setting
    value to +-0 or +-infinity, just return errc::result_out_of_range and
    don't modify value, as per [charconv.from.chars]/1.
    
    libstdc++-v3/ChangeLog:
    
            * src/c++17/fast_float/LOCAL_PATCHES: Update.
            * src/c++17/fast_float/fast_float.h (from_chars_advanced): In
            case of over/underflow, return errc::result_out_of_range and don't
            modify 'value'.

Diff:
---
 libstdc++-v3/src/c++17/fast_float/LOCAL_PATCHES | 1 +
 libstdc++-v3/src/c++17/fast_float/fast_float.h  | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/libstdc++-v3/src/c++17/fast_float/LOCAL_PATCHES b/libstdc++-v3/src/c++17/fast_float/LOCAL_PATCHES
index ad5a60f9a01..71495d6728b 100644
--- a/libstdc++-v3/src/c++17/fast_float/LOCAL_PATCHES
+++ b/libstdc++-v3/src/c++17/fast_float/LOCAL_PATCHES
@@ -1 +1,2 @@
 r12-6647
+r12-6648
diff --git a/libstdc++-v3/src/c++17/fast_float/fast_float.h b/libstdc++-v3/src/c++17/fast_float/fast_float.h
index c908719ec3a..97d28940944 100644
--- a/libstdc++-v3/src/c++17/fast_float/fast_float.h
+++ b/libstdc++-v3/src/c++17/fast_float/fast_float.h
@@ -2884,6 +2884,15 @@ from_chars_result from_chars_advanced(const char *first, const char *last,
   // If we called compute_float<binary_format<T>>(pns.exponent, pns.mantissa) and we have an invalid power (am.power2 < 0),
   // then we need to go the long way around again. This is very uncommon.
   if(am.power2 < 0) { am = digit_comp<T>(pns, am); }
+
+  if((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) || am.power2 == binary_format<T>::infinite_power()) {
+    // In case of over/underflow, return result_out_of_range and don't modify value,
+    // as per [charconv.from.chars]/1.  Note that LWG 3081 wants to modify value in
+    // this case too.
+    answer.ec = std::errc::result_out_of_range;
+    return answer;
+  }
+
   to_float(pns.negative, am, value);
   return answer;
 }


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-01-17 19:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-17 19:33 [gcc r12-6648] libstdc++: Adjust fast_float's over/underflow behavior for conformance Patrick Palka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).