diff options
Diffstat (limited to 'src/stdexcept.cpp')
-rw-r--r-- | src/stdexcept.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/stdexcept.cpp b/src/stdexcept.cpp index 9fa4f593137a..660ebfe27355 100644 --- a/src/stdexcept.cpp +++ b/src/stdexcept.cpp @@ -16,8 +16,13 @@ #include <cstddef> #include "system_error" -// Use <cxxabi.h> to determine whether we're linking against libc++abi. -#if __has_include(<cxxabi.h>) +#ifndef __has_include +#define __has_include(inc) 0 +#endif + +#if __APPLE__ +#include <cxxabi.h> +#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>) #include <cxxabi.h> #endif @@ -34,7 +39,7 @@ private: const char* str_; typedef std::size_t unused_t; - typedef std::int32_t count_t; + typedef std::ptrdiff_t count_t; static const std::ptrdiff_t offset = static_cast<std::ptrdiff_t>(2*sizeof(unused_t) + sizeof(count_t)); @@ -72,7 +77,7 @@ __libcpp_nmstr::operator=(const __libcpp_nmstr& s) const char* p = str_; str_ = s.str_; __sync_add_and_fetch(&count(), 1); - if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), -1) < 0) + if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), count_t(-1)) < 0) delete [] (p-offset); return *this; } @@ -80,7 +85,7 @@ __libcpp_nmstr::operator=(const __libcpp_nmstr& s) inline __libcpp_nmstr::~__libcpp_nmstr() { - if (__sync_add_and_fetch(&count(), -1) < 0) + if (__sync_add_and_fetch(&count(), count_t(-1)) < 0) delete [] (str_ - offset); } |