summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2015-10-01 11:23:39 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2015-10-01 11:23:39 +0000
commit12ae83b7bb49d843751c78788c9099c8071c8b1a (patch)
treea019470ff02af16e5d85abeda9ad9e5dc945f92f /libstdc++-v3/include
parent7e93eb1a344eea57038b0bf24556aed75034f204 (diff)
downloadgcc-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.h10
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;