]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/include/ext/string_conversions.h
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / ext / string_conversions.h
index a4276f30ba2cfe86fb3e1b0c97445716dbcc3401..0ded5fd05ba6abbb22755659e6b50175546c71bd 100644 (file)
@@ -1,6 +1,6 @@
 // String Conversions -*- C++ -*-
 
-// Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2008-2020 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 // <http://www.gnu.org/licenses/>.
 
+/** @file ext/string_conversions.h
+ *  This file is a GNU extension to the Standard C++ Library.
+ */
+
 #ifndef _STRING_CONVERSIONS_H
 #define _STRING_CONVERSIONS_H 1
 
 #pragma GCC system_header
 
+#if __cplusplus < 201103L
+# include <bits/c++0x_warning.h>
+#else
+
 #include <bits/c++config.h>
 #include <ext/numeric_traits.h>
 #include <bits/functexcept.h>
@@ -35,7 +43,9 @@
 #include <cstdio>
 #include <cerrno>
 
-_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
+namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   // Helper for all the sto* functions.
   template<typename _TRet, typename _Ret = _TRet, typename _CharT,
@@ -48,15 +58,31 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       _Ret __ret;
 
       _CharT* __endptr;
-      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;
+
+      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;
@@ -74,8 +100,8 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
                                 __builtin_va_list), std::size_t __n,
                 const _CharT* __fmt, ...)
     {
-      // XXX Eventually the result will be constructed in place in
-      // the C++0x string, likely with the help of internal hooks.
+      // XXX Eventually the result should be constructed in-place in
+      // the __cxx11 string, likely with the help of internal hooks.
       _CharT* __s = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
                                                          * __n));
 
@@ -89,6 +115,9 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
       return _String(__s, __s + __len);
     }
 
-_GLIBCXX_END_NAMESPACE
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
+
+#endif // C++11
 
 #endif // _STRING_CONVERSIONS_H