forked from OSchip/llvm-project
Fix return type of isinf(double) and isnan(double) where possible.
When using an old version of glibc, a ::isinf(double) and ::isnan(double) function is provided, rather than just the macro required by C and C++. Displace this function using _LIBCPP_PREFERRED_OVERLOAD where possible. The only remaining case where we should get the wrong return type is now glibc + libc++ + a non-clang compiler. llvm-svn: 331241
This commit is contained in:
parent
3678be89f7
commit
c4f593ba1a
|
@ -483,6 +483,20 @@ typename std::enable_if<
|
|||
isinf(_A1) _NOEXCEPT
|
||||
{ return false; }
|
||||
|
||||
#ifdef _LIBCPP_PREFERRED_OVERLOAD
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
isinf(float __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
|
||||
bool
|
||||
isinf(double __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
isinf(long double __lcpp_x) _NOEXCEPT { return __libcpp_isinf(__lcpp_x); }
|
||||
#endif
|
||||
|
||||
#endif // isinf
|
||||
|
||||
// isnan
|
||||
|
@ -513,6 +527,20 @@ typename std::enable_if<std::is_integral<_A1>::value, bool>::type
|
|||
isnan(_A1) _NOEXCEPT
|
||||
{ return false; }
|
||||
|
||||
#ifdef _LIBCPP_PREFERRED_OVERLOAD
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
isnan(float __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
|
||||
bool
|
||||
isnan(double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
isnan(long double __lcpp_x) _NOEXCEPT { return __libcpp_isnan(__lcpp_x); }
|
||||
#endif
|
||||
|
||||
#endif // isnan
|
||||
|
||||
// isnormal
|
||||
|
|
|
@ -661,11 +661,12 @@ void test_isinf()
|
|||
static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");
|
||||
|
||||
typedef decltype(std::isinf((double)0)) DoubleRetType;
|
||||
#ifndef __linux__
|
||||
#if !defined(__linux__) || defined(__clang__)
|
||||
static_assert((std::is_same<DoubleRetType, bool>::value), "");
|
||||
#else
|
||||
// GLIBC < 2.26 defines 'isinf(double)' with a return type of 'int' in
|
||||
// all C++ dialects. The test should tolerate this.
|
||||
// GLIBC < 2.23 defines 'isinf(double)' with a return type of 'int' in
|
||||
// all C++ dialects. The test should tolerate this when libc++ can't work
|
||||
// around it.
|
||||
// See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
|
||||
static_assert((std::is_same<DoubleRetType, bool>::value
|
||||
|| std::is_same<DoubleRetType, int>::value), "");
|
||||
|
@ -746,11 +747,12 @@ void test_isnan()
|
|||
static_assert((std::is_same<decltype(std::isnan((float)0)), bool>::value), "");
|
||||
|
||||
typedef decltype(std::isnan((double)0)) DoubleRetType;
|
||||
#ifndef __linux__
|
||||
#if !defined(__linux__) || defined(__clang__)
|
||||
static_assert((std::is_same<DoubleRetType, bool>::value), "");
|
||||
#else
|
||||
// GLIBC < 2.26 defines 'isnan(double)' with a return type of 'int' in
|
||||
// all C++ dialects. The test should tolerate this.
|
||||
// GLIBC < 2.23 defines 'isinf(double)' with a return type of 'int' in
|
||||
// all C++ dialects. The test should tolerate this when libc++ can't work
|
||||
// around it.
|
||||
// See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
|
||||
static_assert((std::is_same<DoubleRetType, bool>::value
|
||||
|| std::is_same<DoubleRetType, int>::value), "");
|
||||
|
|
Loading…
Reference in New Issue