summaryrefslogtreecommitdiff
path: root/test/std/numerics/c.math
diff options
context:
space:
mode:
Diffstat (limited to 'test/std/numerics/c.math')
-rw-r--r--test/std/numerics/c.math/cmath.pass.cpp75
-rw-r--r--test/std/numerics/c.math/cmath_isinf.pass.cpp30
-rw-r--r--test/std/numerics/c.math/cmath_isnan.pass.cpp30
3 files changed, 72 insertions, 63 deletions
diff --git a/test/std/numerics/c.math/cmath.pass.cpp b/test/std/numerics/c.math/cmath.pass.cpp
index 0b0d86288737a..7161bd37e3e2a 100644
--- a/test/std/numerics/c.math/cmath.pass.cpp
+++ b/test/std/numerics/c.math/cmath.pass.cpp
@@ -9,13 +9,11 @@
// <cmath>
-// NOTE: isinf and isnan are tested separately because they are expected to fail
-// on linux. We don't want their expected failure to hide other failures in this file.
-
#include <cmath>
#include <type_traits>
#include <cassert>
+#include "test_macros.h"
#include "hexfloat.h"
// convertible to int/float/double/etc
@@ -79,6 +77,7 @@ Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }
Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); }
Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); }
Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); }
+Ambiguous hypot(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }
Ambiguous ilogb(Ambiguous){ return Ambiguous(); }
Ambiguous lgamma(Ambiguous){ return Ambiguous(); }
Ambiguous llrint(Ambiguous){ return Ambiguous(); }
@@ -631,6 +630,29 @@ void test_isgreaterequal()
assert(std::isgreaterequal(-1.0, 0.F) == false);
}
+void test_isinf()
+{
+#ifdef isinf
+#error isinf defined
+#endif
+ static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");
+
+ typedef decltype(std::isinf((double)0)) DoubleRetType;
+#ifndef __linux__
+ 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.
+ // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
+ static_assert((std::is_same<DoubleRetType, bool>::value
+ || std::is_same<DoubleRetType, int>::value), "");
+#endif
+
+ static_assert((std::is_same<decltype(std::isinf(0)), bool>::value), "");
+ static_assert((std::is_same<decltype(std::isinf((long double)0)), bool>::value), "");
+ assert(std::isinf(-1.0) == false);
+}
+
void test_isless()
{
#ifdef isless
@@ -688,6 +710,29 @@ void test_islessgreater()
assert(std::islessgreater(-1.0, 0.F) == true);
}
+void test_isnan()
+{
+#ifdef isnan
+#error isnan defined
+#endif
+ static_assert((std::is_same<decltype(std::isnan((float)0)), bool>::value), "");
+
+ typedef decltype(std::isnan((double)0)) DoubleRetType;
+#ifndef __linux__
+ 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.
+ // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
+ static_assert((std::is_same<DoubleRetType, bool>::value
+ || std::is_same<DoubleRetType, int>::value), "");
+#endif
+
+ static_assert((std::is_same<decltype(std::isnan(0)), bool>::value), "");
+ static_assert((std::is_same<decltype(std::isnan((long double)0)), bool>::value), "");
+ assert(std::isnan(-1.0) == false);
+}
+
void test_isunordered()
{
#ifdef isunordered
@@ -1010,6 +1055,28 @@ void test_hypot()
static_assert((std::is_same<decltype(std::hypot((int)0, (int)0)), double>::value), "");
static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
assert(std::hypot(3,4) == 5);
+
+#if TEST_STD_VER > 14
+ static_assert((std::is_same<decltype(std::hypot((float)0, (float)0, (float)0)), float>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (bool)0, (float)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned short)0, (double)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (int)0, (long double)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (double)0, (long)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0, (unsigned long)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (int)0, (long long)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (int)0, (unsigned long long)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (double)0, (double)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0, (long double)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (float)0, (double)0)), double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (float)0, (long double)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((float)0, (double)0, (long double)0)), long double>::value), "");
+ static_assert((std::is_same<decltype(std::hypot((int)0, (int)0, (int)0)), double>::value), "");
+ static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");
+
+ assert(std::hypot(2,3,6) == 7);
+ assert(std::hypot(1,4,8) == 9);
+#endif
}
void test_ilogb()
@@ -1443,9 +1510,11 @@ int main()
test_isnormal();
test_isgreater();
test_isgreaterequal();
+ test_isinf();
test_isless();
test_islessequal();
test_islessgreater();
+ test_isnan();
test_isunordered();
test_acosh();
test_asinh();
diff --git a/test/std/numerics/c.math/cmath_isinf.pass.cpp b/test/std/numerics/c.math/cmath_isinf.pass.cpp
deleted file mode 100644
index 6cde04d9bc868..0000000000000
--- a/test/std/numerics/c.math/cmath_isinf.pass.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// <cmath>
-
-// isinf
-
-// XFAIL: linux
-
-#include <cmath>
-#include <type_traits>
-#include <cassert>
-
-int main()
-{
-#ifdef isinf
-#error isinf defined
-#endif
- static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");
- static_assert((std::is_same<decltype(std::isinf((double)0)), bool>::value), "");
- static_assert((std::is_same<decltype(std::isinf(0)), bool>::value), "");
- static_assert((std::is_same<decltype(std::isinf((long double)0)), bool>::value), "");
- assert(std::isinf(-1.0) == false);
-} \ No newline at end of file
diff --git a/test/std/numerics/c.math/cmath_isnan.pass.cpp b/test/std/numerics/c.math/cmath_isnan.pass.cpp
deleted file mode 100644
index 7b33b96470528..0000000000000
--- a/test/std/numerics/c.math/cmath_isnan.pass.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// <cmath>
-
-// isnan
-
-// XFAIL: linux
-
-#include <cmath>
-#include <type_traits>
-#include <cassert>
-
-int main()
-{
-#ifdef isnan
-#error isnan defined
-#endif
- static_assert((std::is_same<decltype(std::isnan((float)0)), bool>::value), "");
- static_assert((std::is_same<decltype(std::isnan((double)0)), bool>::value), "");
- static_assert((std::is_same<decltype(std::isnan(0)), bool>::value), "");
- static_assert((std::is_same<decltype(std::isnan((long double)0)), bool>::value), "");
- assert(std::isnan(-1.0) == false);
-}