From: Jonathan Wakely Date: Mon, 18 Apr 2016 15:43:50 +0000 (+0100) Subject: Avoid -Wsign-compare warnings in std::to_string() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8dc1e574aeed3522ce95b83290a84933805199b0;p=gcc.git Avoid -Wsign-compare warnings in std::to_string() * include/ext/string_conversions.h (__stoa): Avoid -Wsign-compare warnings. From-SVN: r235151 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2cabdac67ba..5f47dcdbf99 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,8 @@ +2016-04-18 Jonathan Wakely + + * 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. diff --git a/libstdc++-v3/include/ext/string_conversions.h b/libstdc++-v3/include/ext/string_conversions.h index 8a8fec12d7f..0a0036d255e 100644 --- a/libstdc++-v3/include/ext/string_conversions.h +++ b/libstdc++-v3/include/ext/string_conversions.h @@ -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::__min) + || __val > _TRet(__numeric_traits::__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::__min - || __tmp > __numeric_traits::__max))) + || _Range_chk::_S_chk(__tmp, std::is_same<_Ret, int>{})) std::__throw_out_of_range(__name); else __ret = __tmp;