diff options
author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-10-01 11:23:39 +0000 |
---|---|---|
committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-10-01 11:23:39 +0000 |
commit | 12ae83b7bb49d843751c78788c9099c8071c8b1a (patch) | |
tree | a019470ff02af16e5d85abeda9ad9e5dc945f92f /libstdc++-v3/include | |
parent | 7e93eb1a344eea57038b0bf24556aed75034f204 (diff) | |
download | gcc-12ae83b7bb49d843751c78788c9099c8071c8b1a.tar.gz |
Save-and-restore errno more carefully in libstdc++
* doc/xml/manual/diagnostics.xml: Document use of errno.
* doc/html/*: Regenerate.
* config/locale/generic/c_locale.cc (_Save_errno): New helper.
(__convert_to_v): Use _Save_errno.
* include/ext/string_conversions.h (__stoa): Only restore errno when
it isn't set to non-zero.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228328 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/ext/string_conversions.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/libstdc++-v3/include/ext/string_conversions.h b/libstdc++-v3/include/ext/string_conversions.h index 58387a282ef..7f37e694182 100644 --- a/libstdc++-v3/include/ext/string_conversions.h +++ b/libstdc++-v3/include/ext/string_conversions.h @@ -58,8 +58,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Ret __ret; _CharT* __endptr; - const int __saved_errno = errno; - errno = 0; + + struct _Save_errno { + _Save_errno() : _M_errno(errno) { errno = 0; } + ~_Save_errno() { if (errno == 0) errno = _M_errno; } + int _M_errno; + } const __save_errno; + const _TRet __tmp = __convf(__str, &__endptr, __base...); if (__endptr == __str) @@ -71,7 +76,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::__throw_out_of_range(__name); else __ret = __tmp; - errno = __saved_errno; if (__idx) *__idx = __endptr - __str; |