]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: add casts to from_chars in <charconv> [PR111883]
authorMarek Polacek <polacek@redhat.com>
Thu, 19 Oct 2023 21:48:44 +0000 (17:48 -0400)
committerMarek Polacek <polacek@redhat.com>
Fri, 20 Oct 2023 16:35:58 +0000 (12:35 -0400)
This fixes

.../charconv: In function 'std::from_chars_result std::from_chars(const char*, const char*, _Float16&, chars_format)':
.../charconv:687:17: warning: converting to '_Float16' from 'float' with greater conversion rank
  687 |       __value = __val;
      |                 ^~~~~
.../charconv: In function 'std::from_chars_result std::from_chars(const char*, const char*, __gnu_cxx::__bfloat16_t&, chars_format)':
.../charconv:763:17: warning: converting to '__gnu_cxx::__bfloat16_t' {aka '__bf16'} from 'float' with greater conversion rank
  763 |       __value = __val;
      |                 ^~~~~

which was breaking a test:

FAIL: g++.dg/warn/Wstringop-overflow-6.C  -std=gnu++26 (test for excess errors)

PR testsuite/111883

libstdc++-v3/ChangeLog:

* include/std/charconv (from_chars): Add explicit casts.

libstdc++-v3/include/std/charconv

index cb428fe6d3b768366d74d11f116948ab17647e7f..6cb7fecff870be284b8bc4d04d79f1dbd8739208 100644 (file)
@@ -684,7 +684,7 @@ namespace __detail
     from_chars_result __res
       = __from_chars_float16_t(__first, __last, __val, __fmt);
     if (__res.ec == errc{})
-      __value = __val;
+      __value = _Float16(__val);
     return __res;
   }
 #endif
@@ -697,7 +697,7 @@ namespace __detail
     float __val;
     from_chars_result __res = from_chars(__first, __last, __val, __fmt);
     if (__res.ec == errc{})
-      __value = __val;
+      __value = _Float32(__val);
     return __res;
   }
 #endif
@@ -710,7 +710,7 @@ namespace __detail
     double __val;
     from_chars_result __res = from_chars(__first, __last, __val, __fmt);
     if (__res.ec == errc{})
-      __value = __val;
+      __value = _Float64(__val);
     return __res;
   }
 #endif
@@ -723,7 +723,7 @@ namespace __detail
     long double __val;
     from_chars_result __res = from_chars(__first, __last, __val, __fmt);
     if (__res.ec == errc{})
-      __value = __val;
+      __value = _Float128(__val);
     return __res;
   }
 #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
@@ -739,7 +739,7 @@ namespace __detail
     __extension__ __ieee128 __val;
     from_chars_result __res = from_chars(__first, __last, __val, __fmt);
     if (__res.ec == errc{})
-      __value = __val;
+      __value = _Float128(__val);
     return __res;
   }
 #else
@@ -760,7 +760,7 @@ namespace __detail
     from_chars_result __res
       = __from_chars_bfloat16_t(__first, __last, __val, __fmt);
     if (__res.ec == errc{})
-      __value = __val;
+      __value = __gnu_cxx::__bfloat16_t(__val);
     return __res;
   }
 #endif