[libcxx-commits] [libcxx] [libc++][math] Add `constexpr` to `std::fpclassify` (PR #210993)
Lucas Mellone via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jul 21 07:12:45 PDT 2026
https://github.com/lknknm updated https://github.com/llvm/llvm-project/pull/210993
>From 8e4ce1588756045195a9c05c3688ee0919433b32 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Tue, 21 Jul 2026 15:13:46 +0200
Subject: [PATCH 1/2] add: constexpr to fpclassify
---
libcxx/include/cmath | 2 +-
libcxx/include/math.h | 8 ++++----
.../libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp | 6 +++---
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/libcxx/include/cmath b/libcxx/include/cmath
index 208791ca0804c..992854b0490a3 100644
--- a/libcxx/include/cmath
+++ b/libcxx/include/cmath
@@ -138,7 +138,7 @@ long double tanhl(long double x);
bool signbit(arithmetic x);
-int fpclassify(arithmetic x);
+int fpclassify(arithmetic x); // constexpr since C++23
bool isfinite(arithmetic x);
bool isinf(arithmetic x);
diff --git a/libcxx/include/math.h b/libcxx/include/math.h
index 1db61538e995f..86ad9a1ae9b10 100644
--- a/libcxx/include/math.h
+++ b/libcxx/include/math.h
@@ -389,22 +389,22 @@ namespace __math {
// template on non-double overloads to make them weaker than same overloads from MSVC runtime
template <class = int>
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI int fpclassify(float __x) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI int fpclassify(float __x) _NOEXCEPT {
return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
}
template <class = int>
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI int fpclassify(double __x) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI int fpclassify(double __x) _NOEXCEPT {
return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
}
template <class = int>
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI int fpclassify(long double __x) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI int fpclassify(long double __x) _NOEXCEPT {
return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, __x);
}
template <class _A1, std::__enable_if_t<std::is_integral<_A1>::value, int> = 0>
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI int fpclassify(_A1 __x) _NOEXCEPT {
return __x == 0 ? FP_ZERO : FP_NORMAL;
}
diff --git a/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp b/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp
index 93865afc5e68b..926ff37cddbfc 100644
--- a/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp
+++ b/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp
@@ -203,9 +203,9 @@ int main(int, char**) {
ASSERT_NOT_CONSTEXPR_CXX23(std::fmaf(1.0f, 1.0f, 1.0f) == 2.0f);
ASSERT_NOT_CONSTEXPR_CXX23(std::fmal(1.0L, 1.0L, 1.0L) == 2.0L);
- ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0f) == FP_NORMAL);
- ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0) == FP_NORMAL);
- ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0L) == FP_NORMAL);
+ ASSERT_CONSTEXPR_CXX23(std::fpclassify(-1.0f) == FP_NORMAL);
+ ASSERT_CONSTEXPR_CXX23(std::fpclassify(-1.0) == FP_NORMAL);
+ ASSERT_CONSTEXPR_CXX23(std::fpclassify(-1.0L) == FP_NORMAL);
ASSERT_CONSTEXPR_CXX23(std::isfinite(-1.0f) == 1);
ASSERT_CONSTEXPR_CXX23(std::isfinite(-1.0) == 1);
>From b6ecf4cfc60def795b8f4814af4e9df2feda5121 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Tue, 21 Jul 2026 16:12:31 +0200
Subject: [PATCH 2/2] update: gcc tests
---
.../libcxx/numerics/c.math/constexpr-cxx23-gcc.pass.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-gcc.pass.cpp b/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-gcc.pass.cpp
index d8779706bcee2..455c03ef58d18 100644
--- a/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-gcc.pass.cpp
+++ b/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-gcc.pass.cpp
@@ -197,9 +197,9 @@ int main(int, char**) {
ASSERT_CONSTEXPR_CXX23(std::fmaf(1.0f, 1.0f, 1.0f) == 2.0f);
ASSERT_CONSTEXPR_CXX23(std::fmal(1.0L, 1.0L, 1.0L) == 2.0L);
- ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0f) == FP_NORMAL);
- ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0) == FP_NORMAL);
- ASSERT_NOT_CONSTEXPR_CXX23(std::fpclassify(-1.0L) == FP_NORMAL);
+ ASSERT_CONSTEXPR_CXX23(std::fpclassify(-1.0f) == FP_NORMAL);
+ ASSERT_CONSTEXPR_CXX23(std::fpclassify(-1.0) == FP_NORMAL);
+ ASSERT_CONSTEXPR_CXX23(std::fpclassify(-1.0L) == FP_NORMAL);
ASSERT_CONSTEXPR_CXX23(std::isfinite(-1.0f) == 1);
ASSERT_CONSTEXPR_CXX23(std::isfinite(-1.0) == 1);
More information about the libcxx-commits
mailing list