On 18/05/17 19:10 +0800, Xi Ruoyao wrote:
This UB has been hiding so long...

Indeed! Thanks for the patch.

2017-03-11  Xi Ruoyao  <r...@stu.xidian.edu.cn>

        PR libstdc++/67214
        * include/bits/locale_facets.tcc (_M_extract_int):
          Add explicit conversion to avoid signed overflow.
---
 libstdc++-v3/include/bits/locale_facets.tcc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/bits/locale_facets.tcc 
b/libstdc++-v3/include/bits/locale_facets.tcc
index 351190c..5f85d15 100644
--- a/libstdc++-v3/include/bits/locale_facets.tcc
+++ b/libstdc++-v3/include/bits/locale_facets.tcc
@@ -470,7 +470,8 @@ _GLIBCXX_BEGIN_NAMESPACE_LDBL
        bool __testoverflow = false;
        const __unsigned_type __max =
          (__negative && __gnu_cxx::__numeric_traits<_ValueT>::__is_signed)
-         ? -__gnu_cxx::__numeric_traits<_ValueT>::__min
+         ? -static_cast<__unsigned_type>(__gnu_cxx::
+                        __numeric_traits<_ValueT>::__min)

Do we need to keep the negation, or can we just cast to
__unsigned_type?

Reply via email to