[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