Fix new testcase to not require std::copysign
authorJonathan Wakely <jwakely@redhat.com>
Fri, 3 May 2019 19:25:05 +0000 (20:25 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 3 May 2019 19:25:05 +0000 (20:25 +0100)
Use __builtin_copysign{,f,l} when std::copysign isn't available.

PR libstdc++/61761
* testsuite/26_numerics/complex/proj.cc: Don't assume <cmath> defines
std::copysign.

From-SVN: r270859

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/26_numerics/complex/proj.cc

index b1390142cb18bca42836f4015348c82b537c3453..40396312a0c90ed9d7ad6dec11a69e177d29e1f0 100644 (file)
@@ -1,5 +1,9 @@
 2019-05-03  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/61761
+       * testsuite/26_numerics/complex/proj.cc: Don't assume <cmath> defines
+       std::copysign.
+
        PR libstdc++/52119
        * include/ext/numeric_traits.h (__glibcxx_min): Avoid integer
        overflow warning with -Wpedantic -Wsystem-headers.
index b70ca4c58e950c16a7bab8317d67f623f428b0b4..caf12d25103085d0545101dfdb36adedbac885aa 100644 (file)
 #include <limits>
 #include <testsuite_hooks.h>
 
+namespace test
+{
+#ifdef _GLIBCXX_USE_C99_MATH_TR1
+  using std::copysign;
+#else
+  bool copysign(float x, float y)
+  { return __builtin_copysignf(x, y); }
+
+  bool copysign(double x, double y)
+  { return __builtin_copysign(x, y); }
+
+  bool copysign(long double x, long double y)
+  { return __builtin_copysignl(x, y); }
+#endif
+}
+
 template<typename T>
 bool eq(const std::complex<T>& x, const std::complex<T>& y)
 {
@@ -28,9 +44,9 @@ bool eq(const std::complex<T>& x, const std::complex<T>& y)
   bool nan_imags = std::isnan(x.imag()) && std::isnan(y.imag());
 
   bool sign_reals
-    = std::copysign(T(1), x.real()) == std::copysign(T(1), y.real());
+    = test::copysign(T(1), x.real()) == test::copysign(T(1), y.real());
   bool sign_imags
-    = std::copysign(T(1), x.imag()) == std::copysign(T(1), y.imag());
+    = test::copysign(T(1), x.imag()) == test::copysign(T(1), y.imag());
 
   return ((x.real() == y.real() && sign_reals) || nan_reals)
     && ((x.imag() == y.imag() && sign_imags) || nan_imags);