Avoid -Wsign-compare warnings in std::to_string()
authorJonathan Wakely <jwakely@redhat.com>
Mon, 18 Apr 2016 15:43:50 +0000 (16:43 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 18 Apr 2016 15:43:50 +0000 (16:43 +0100)
* include/ext/string_conversions.h (__stoa): Avoid -Wsign-compare
        warnings.

From-SVN: r235151

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/string_conversions.h

index 2cabdac67ba489d4f4d83d63b3d739fb0621ce40..5f47dcdbf99a51c75d9bf14b1e73b92ee8d2648a 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-18  Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/ext/string_conversions.h (__stoa): Avoid -Wsign-compare
+       warnings.
+
 2016-04-17  Edward Smith-Rowland  <3dw4rd@verizon.net>
 
        * include/bits/specfun.h: Trivial comment misspelling.
index 8a8fec12d7fc33b0bc28c10b62ccd0bfff9ff1c9..0a0036d255e2c9481520839cb1f3f5f5e4567e9b 100644 (file)
@@ -65,14 +65,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        int _M_errno;
       } const __save_errno;
 
+      struct _Range_chk {
+         static bool
+         _S_chk(_TRet, std::false_type) { return false; }
+
+         static bool
+         _S_chk(_TRet __val, std::true_type) // only called when _Ret is int
+         {
+           return __val < _TRet(__numeric_traits<int>::__min)
+             || __val > _TRet(__numeric_traits<int>::__max);
+         }
+      };
+
       const _TRet __tmp = __convf(__str, &__endptr, __base...);
 
       if (__endptr == __str)
        std::__throw_invalid_argument(__name);
       else if (errno == ERANGE
-              || (std::__are_same<_Ret, int>::__value
-                  && (__tmp < __numeric_traits<int>::__min
-                      || __tmp > __numeric_traits<int>::__max)))
+         || _Range_chk::_S_chk(__tmp, std::is_same<_Ret, int>{}))
        std::__throw_out_of_range(__name);
       else
        __ret = __tmp;