[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
Fri Aug 21 05:23:04 PDT 2026


https://github.com/lknknm created https://github.com/llvm/llvm-project/pull/217897

This patch generalizes the test-suite solutions for `signbit.pass.cpp` and `fpclassify.pass.cpp` as per the review comments present in https://github.com/llvm/llvm-project/pull/210075 for conformance purposes.

Follows-up: https://github.com/llvm/llvm-project/pull/210075#discussion_r3629842324

>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/2] 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/2] 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;
 }



More information about the libcxx-commits mailing list