Saleem Abdulrasool: If errno is defined as volatile int, the qualifier differences can cause
template typename deductions on swap<> (used in string.cpp).  Use
decltype(errno) to replicate the type and qualifier information for holding the
errno value.  Because errno is expected to be assignable, there is no need to
use typename std::remove_const<decltype(errno)>::type to hold the value.

llvm-svn: 173172
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 2446649c1e3fca16d7524d75260d3d588c36e671
diff --git a/src/string.cpp b/src/string.cpp
index a21a155..40723e7 100644
--- a/src/string.cpp
+++ b/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);