[cfe-commits] [PATCH] [libc++] make errno saving more resilient to types

Saleem Abdulrasool compnerd at compnerd.org
Tue Jan 22 07:46:33 PST 2013


  Updated to use the remove_reference.  decltype(errno) is a reference to an int (int&) [with possible qualifiers e.g. volatile].  Use std::remove_reference when using decltype to ensure that the variable is able to actually hold the value rather than a reference to the value.

http://llvm-reviews.chandlerc.com/D318

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D318?vs=739&id=744#toc

Files:
  include/locale
  src/string.cpp

Index: include/locale
===================================================================
--- include/locale
+++ include/locale
@@ -830,11 +830,11 @@
 {
     if (__a != __a_end)
     {
-        int __save_errno = errno;
+        typename _VSTD::remove_reference<decltype(errno)>::type __save_errno = errno;
         errno = 0;
         char *__p2;
         long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
-        int __current_errno = errno;
+        typename _VSTD::remove_reference<decltype(errno)>::type __current_errno = errno;
         if (__current_errno == 0)
             errno = __save_errno;
         if (__p2 != __a_end)
@@ -870,11 +870,11 @@
             __err = ios_base::failbit;
             return 0;
         }
-        int __save_errno = errno;
+        typename _VSTD::remove_reference<decltype(errno)>::type __save_errno = errno;
         errno = 0;
         char *__p2;
         unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE);
-        int __current_errno = errno;
+        typename _VSTD::remove_reference<decltype(errno)>::type __current_errno = errno;
         if (__current_errno == 0)
             errno = __save_errno;
         if (__p2 != __a_end)
Index: src/string.cpp
===================================================================
--- src/string.cpp
+++ src/string.cpp
@@ -31,7 +31,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long r = strtol(p, &ptr, base);
     swap(errno, errno_save);
@@ -52,7 +52,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long r = wcstol(p, &ptr, base);
     swap(errno, errno_save);
@@ -73,7 +73,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long r = strtol(p, &ptr, base);
     swap(errno, errno_save);
@@ -93,7 +93,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long r = wcstol(p, &ptr, base);
     swap(errno, errno_save);
@@ -113,7 +113,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     unsigned long r = strtoul(p, &ptr, base);
     swap(errno, errno_save);
@@ -133,7 +133,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     unsigned long r = wcstoul(p, &ptr, base);
     swap(errno, errno_save);
@@ -153,7 +153,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long long r = strtoll(p, &ptr, base);
     swap(errno, errno_save);
@@ -173,7 +173,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long long r = wcstoll(p, &ptr, base);
     swap(errno, errno_save);
@@ -193,7 +193,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     unsigned long long r = strtoull(p, &ptr, base);
     swap(errno, errno_save);
@@ -213,7 +213,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     unsigned long long r = wcstoull(p, &ptr, base);
     swap(errno, errno_save);
@@ -233,7 +233,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     float r = strtof(p, &ptr);
     swap(errno, errno_save);
@@ -253,7 +253,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     float r = wcstof(p, &ptr);
     swap(errno, errno_save);
@@ -273,7 +273,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     double r = strtod(p, &ptr);
     swap(errno, errno_save);
@@ -293,7 +293,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     double r = wcstod(p, &ptr);
     swap(errno, errno_save);
@@ -313,7 +313,7 @@
 {
     char* ptr;
     const char* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long double r = strtold(p, &ptr);
     swap(errno, errno_save);
@@ -333,7 +333,7 @@
 {
     wchar_t* ptr;
     const wchar_t* const p = str.c_str();
-    int errno_save = errno;
+    typename remove_reference<decltype(errno)>::type errno_save = errno;
     errno = 0;
     long double r = wcstold(p, &ptr);
     swap(errno, errno_save);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D318.2.patch
Type: text/x-patch
Size: 5689 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130122/aecf6435/attachment.bin>


More information about the cfe-commits mailing list