[libcxx-commits] [libcxx] [libc++][math][NFC] Generalize test-suite solution for `signbit` and `fpclassify` tests (PR #217897)
Lucas Mellone via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Aug 24 01:24:21 PDT 2026
https://github.com/lknknm updated https://github.com/llvm/llvm-project/pull/217897
>From 00b435fad0c5a00de2d8cafafaaa395c81177a43 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Fri, 21 Aug 2026 13:49:07 +0200
Subject: [PATCH 1/3] refactor: fpclassify.pass.cpp
---
.../std/numerics/c.math/fpclassify.pass.cpp | 30 +++++++------------
1 file changed, 11 insertions(+), 19 deletions(-)
diff --git a/libcxx/test/std/numerics/c.math/fpclassify.pass.cpp b/libcxx/test/std/numerics/c.math/fpclassify.pass.cpp
index 10b2297fce105..b5fa618655c3e 100644
--- a/libcxx/test/std/numerics/c.math/fpclassify.pass.cpp
+++ b/libcxx/test/std/numerics/c.math/fpclassify.pass.cpp
@@ -19,26 +19,20 @@
struct TestFloat {
template <class T>
TEST_CONSTEXPR_CXX23 void operator()() const {
- using lim = std::numeric_limits<T>;
- TEST_CONSTEXPR_CXX23 T max = lim::max();
- TEST_CONSTEXPR_CXX23 T min = lim::min();
- TEST_CONSTEXPR_CXX23 T d_min = lim::denorm_min();
- TEST_CONSTEXPR_CXX23 T inf = lim::infinity();
- TEST_CONSTEXPR_CXX23 T nan = lim::quiet_NaN();
- TEST_CONSTEXPR_CXX23 T s_nan = lim::signaling_NaN();
+ using lim = std::numeric_limits<T>;
- assert(std::fpclassify(nan) == FP_NAN);
- assert(std::fpclassify(s_nan) == FP_NAN);
+ assert(std::fpclassify(lim::quiet_NaN()) == FP_NAN);
+ assert(std::fpclassify(lim::signaling_NaN()) == FP_NAN);
- assert(std::fpclassify(inf) == FP_INFINITE);
- assert(std::fpclassify(-inf) == FP_INFINITE);
+ assert(std::fpclassify(lim::infinity()) == FP_INFINITE);
+ assert(std::fpclassify(-lim::infinity()) == FP_INFINITE);
assert(std::fpclassify(T(1)) == FP_NORMAL);
assert(std::fpclassify(T(-1)) == FP_NORMAL);
- assert(std::fpclassify(max) == FP_NORMAL);
- assert(std::fpclassify(min) == FP_NORMAL);
+ assert(std::fpclassify(lim::max()) == FP_NORMAL);
+ assert(std::fpclassify(lim::min()) == FP_NORMAL);
- assert(std::fpclassify(d_min) == FP_SUBNORMAL);
+ assert(std::fpclassify(lim::denorm_min()) == FP_SUBNORMAL);
assert(std::fpclassify(T(0)) == FP_ZERO);
assert(std::fpclassify(T(-0.0)) == FP_ZERO);
@@ -48,16 +42,14 @@ struct TestFloat {
struct TestInt {
template <class T>
TEST_CONSTEXPR_CXX23 void operator()() const {
- using lim = std::numeric_limits<T>;
- TEST_CONSTEXPR_CXX23 T max = lim::max();
- TEST_CONSTEXPR_CXX23 T low = lim::lowest();
+ using lim = std::numeric_limits<T>;
assert(std::fpclassify(T(0)) == FP_ZERO);
assert(std::fpclassify(T(1)) == FP_NORMAL);
- assert(std::fpclassify(max) == FP_NORMAL);
+ assert(std::fpclassify(lim::max()) == FP_NORMAL);
if (std::is_signed<T>::value) {
- assert(std::fpclassify(low) == FP_NORMAL);
+ assert(std::fpclassify(lim::lowest()) == FP_NORMAL);
assert(std::fpclassify(T(-1)) == FP_NORMAL);
}
}
>From e603d355563529d40cfc13bc2884be5f7aa065bb Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Fri, 21 Aug 2026 14:17:12 +0200
Subject: [PATCH 2/3] refactor: signbit.pass.cpp
---
.../test/std/numerics/c.math/signbit.pass.cpp | 63 +++++++++----------
1 file changed, 28 insertions(+), 35 deletions(-)
diff --git a/libcxx/test/std/numerics/c.math/signbit.pass.cpp b/libcxx/test/std/numerics/c.math/signbit.pass.cpp
index ce219b3a35c0b..d1128b322b389 100644
--- a/libcxx/test/std/numerics/c.math/signbit.pass.cpp
+++ b/libcxx/test/std/numerics/c.math/signbit.pass.cpp
@@ -24,59 +24,43 @@
struct TestFloat {
template <class T>
- static TEST_CONSTEXPR_CXX23 bool test() {
+ static TEST_CONSTEXPR_CXX23 void operator()() {
+ using lim = std::numeric_limits<T>;
+
assert(!std::signbit(T(0)));
- assert(!std::signbit(std::numeric_limits<T>::min()));
- assert(!std::signbit(std::numeric_limits<T>::denorm_min()));
- assert(!std::signbit(std::numeric_limits<T>::max()));
- assert(!std::signbit(std::numeric_limits<T>::infinity()));
- assert(!std::signbit(std::numeric_limits<T>::quiet_NaN()));
- assert(!std::signbit(std::numeric_limits<T>::signaling_NaN()));
+ assert(!std::signbit(lim::min()));
+ assert(!std::signbit(lim::denorm_min()));
+ assert(!std::signbit(lim::max()));
+ assert(!std::signbit(lim::infinity()));
+ assert(!std::signbit(lim::quiet_NaN()));
+ assert(!std::signbit(lim::signaling_NaN()));
assert(std::signbit(-T(0)));
- assert(std::signbit(-std::numeric_limits<T>::infinity()));
- assert(std::signbit(std::numeric_limits<T>::lowest()));
-
- return true;
- }
-
- template <class T>
- TEST_CONSTEXPR_CXX23 void operator()() {
- test<T>();
-#if TEST_STD_VER >= 23
- static_assert(test<T>());
-#endif
+ assert(std::signbit(-lim::infinity()));
+ assert(std::signbit(lim::lowest()));
}
};
struct TestInt {
template <class T>
- static TEST_CONSTEXPR_CXX23 bool test() {
- assert(!std::signbit(std::numeric_limits<T>::max()));
+ static TEST_CONSTEXPR_CXX23 void operator()() {
+ using lim = std::numeric_limits<T>;
+
+ assert(!std::signbit(lim::max()));
assert(!std::signbit(T(0)));
if (std::is_unsigned<T>::value) {
- assert(!std::signbit(std::numeric_limits<T>::lowest()));
+ assert(!std::signbit(lim::lowest()));
} else {
- assert(std::signbit(std::numeric_limits<T>::lowest()));
+ assert(std::signbit(lim::lowest()));
}
-
- return true;
- }
-
- template <class T>
- TEST_CONSTEXPR_CXX23 void operator()() {
- test<T>();
-#if TEST_STD_VER >= 23
- static_assert(test<T>());
-#endif
}
};
template <typename T>
struct ConvertibleTo {
- operator T() const { return T(); }
+ TEST_CONSTEXPR_CXX23 operator T() const { return T(); }
};
-int main(int, char**) {
+TEST_CONSTEXPR_CXX23 bool test() {
types::for_each(types::floating_point_types(), TestFloat());
types::for_each(types::integral_types(), TestInt());
@@ -88,5 +72,14 @@ int main(int, char**) {
assert(!std::signbit(ConvertibleTo<double>()));
assert(!std::signbit(ConvertibleTo<long double>()));
}
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+#if TEST_STD_VER >= 23
+ static_assert(test());
+#endif
return 0;
}
>From 55891f554cccf4a00ba77d7aea8a8bb3f331aa05 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Fri, 21 Aug 2026 14:42:01 +0200
Subject: [PATCH 3/3] fix: remove static from operator()()
---
libcxx/test/std/numerics/c.math/signbit.pass.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libcxx/test/std/numerics/c.math/signbit.pass.cpp b/libcxx/test/std/numerics/c.math/signbit.pass.cpp
index d1128b322b389..f31034ec50ba8 100644
--- a/libcxx/test/std/numerics/c.math/signbit.pass.cpp
+++ b/libcxx/test/std/numerics/c.math/signbit.pass.cpp
@@ -24,7 +24,7 @@
struct TestFloat {
template <class T>
- static TEST_CONSTEXPR_CXX23 void operator()() {
+ TEST_CONSTEXPR_CXX23 void operator()() {
using lim = std::numeric_limits<T>;
assert(!std::signbit(T(0)));
@@ -42,7 +42,7 @@ struct TestFloat {
struct TestInt {
template <class T>
- static TEST_CONSTEXPR_CXX23 void operator()() {
+ TEST_CONSTEXPR_CXX23 void operator()() {
using lim = std::numeric_limits<T>;
assert(!std::signbit(lim::max()));
More information about the libcxx-commits
mailing list