[libcxx] r198623 - Back out the <type_traits> changes from r198431; they were breaking when building with glibc. Need to find a better solution for PR18218.

Marshall Clow mclow.lists at gmail.com
Mon Jan 6 10:12:50 PST 2014


Author: marshall
Date: Mon Jan  6 12:12:50 2014
New Revision: 198623

URL: http://llvm.org/viewvc/llvm-project?rev=198623&view=rev
Log:
Back out the <type_traits> changes from r198431; they were breaking when building with glibc. Need to find a better solution for PR18218.

Modified:
    libcxx/trunk/include/cmath
    libcxx/trunk/test/numerics/c.math/cmath.pass.cpp

Modified: libcxx/trunk/include/cmath
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/cmath?rev=198623&r1=198622&r2=198623&view=diff
==============================================================================
--- libcxx/trunk/include/cmath (original)
+++ libcxx/trunk/include/cmath Mon Jan  6 12:12:50 2014
@@ -419,25 +419,12 @@ __libcpp_isnan(_A1 __x) _NOEXCEPT
 
 #undef isnan
 
+template <class _A1>
 inline _LIBCPP_INLINE_VISIBILITY
-bool
-isnan(float __x) _NOEXCEPT
-{
-    return __libcpp_isnan(__x);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isnan(double __x) _NOEXCEPT
-{
-    return __libcpp_isnan(__x);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-isnan(long double __x) _NOEXCEPT
+typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
+isnan(_A1 __x) _NOEXCEPT
 {
-    return __libcpp_isnan(__x);
+    return __libcpp_isnan((typename std::__promote<_A1>::type)__x);
 }
 
 #endif  // isnan
@@ -665,26 +652,6 @@ using ::isunordered;
 using ::float_t;
 using ::double_t;
 
-// isnan
-
-template <class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename std::enable_if<__promote<_A1>::value, bool>::type
-#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-isnan(_A1 __x)
-#else
-isnan(_A1&& __x)
-    _NOEXCEPT_
-    (
-        _NOEXCEPT_(__promote<_A1>::__does_not_throw)
-    )
-#endif
-{
-    typedef typename __promote<_A1>::type type;
-    static_assert(!(is_same<typename remove_reference<_A1>::type, type>::value), "");
-    return __libcpp_isnan(static_cast<type>(_VSTD::forward<_A1>(__x)));
-}
-
 // abs
 
 #if !defined(_AIX)
@@ -985,25 +952,18 @@ inline _LIBCPP_INLINE_VISIBILITY long do
 
 template <class _A1, class _A2>
 inline _LIBCPP_INLINE_VISIBILITY
-typename __promote<_A1, _A2>::type
-#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-pow(_A1 __x, _A2 __y)
-#else
-pow(_A1&& __x, _A2&& __y)
-    _NOEXCEPT_
-    (
-        _NOEXCEPT_(__promote<_A1>::__does_not_throw) &&
-        _NOEXCEPT_(__promote<_A2>::__does_not_throw)
-    )
-#endif
-{
-    typedef typename __promote<_A1>::type _D1;
-    typedef typename __promote<_A2>::type _D2;
-    typedef typename __promote<_D1, _D2>::type type;
-    static_assert((!(is_same<typename remove_reference<_A1>::type, type>::value &&
-                     is_same<typename remove_reference<_A2>::type, type>::value)), "");
-    return pow(static_cast<type>(static_cast<_D1>(_VSTD::forward<_A1>(__x))),
-               static_cast<type>(static_cast<_D2>(_VSTD::forward<_A2>(__y))));
+typename enable_if
+<
+    is_arithmetic<_A1>::value &&
+    is_arithmetic<_A2>::value,
+    typename __promote<_A1, _A2>::type
+>::type
+pow(_A1 __x, _A2 __y) _NOEXCEPT
+{
+    typedef typename __promote<_A1, _A2>::type __result_type;
+    static_assert((!(is_same<_A1, __result_type>::value &&
+                      is_same<_A2, __result_type>::value)), "");
+    return pow((__result_type)__x, (__result_type)__y);
 }
 
 // sin

Modified: libcxx/trunk/test/numerics/c.math/cmath.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/numerics/c.math/cmath.pass.cpp?rev=198623&r1=198622&r2=198623&view=diff
==============================================================================
--- libcxx/trunk/test/numerics/c.math/cmath.pass.cpp (original)
+++ libcxx/trunk/test/numerics/c.math/cmath.pass.cpp Mon Jan  6 12:12:50 2014
@@ -339,14 +339,14 @@ void test_pow()
     static_assert((std::is_same<decltype(std::powf(0,0)), float>::value), "");
     static_assert((std::is_same<decltype(std::powl(0,0)), long double>::value), "");
     static_assert((std::is_same<decltype(std::pow((int)0, (int)0)), double>::value), "");
-    static_assert((std::is_same<decltype(std::pow(Value<int>(), (int)0)), double>::value), "");
-    static_assert((std::is_same<decltype(std::pow(Value<long double>(), (float)0)), long double>::value), "");
-    static_assert((std::is_same<decltype(std::pow((float) 0, Value<float>())), float>::value), "");
+//     static_assert((std::is_same<decltype(std::pow(Value<int>(), (int)0)), double>::value), "");
+//     static_assert((std::is_same<decltype(std::pow(Value<long double>(), (float)0)), long double>::value), "");
+//     static_assert((std::is_same<decltype(std::pow((float) 0, Value<float>())), float>::value), "");
     assert(std::pow(1,1) == 1);
-    assert(std::pow(Value<int,1>(), Value<float,1>())  == 1);
-    assert(std::pow(1.0f, Value<double,1>()) == 1);
-    assert(std::pow(1.0, Value<int,1>()) == 1);
-    assert(std::pow(Value<long double,1>(), 1LL) == 1);
+//     assert(std::pow(Value<int,1>(), Value<float,1>())  == 1);
+//     assert(std::pow(1.0f, Value<double,1>()) == 1);
+//     assert(std::pow(1.0, Value<int,1>()) == 1);
+//     assert(std::pow(Value<long double,1>(), 1LL) == 1);
 }
 
 void test_sin()





More information about the cfe-commits mailing list