[libcxx-commits] [libcxx] [libcxx] p3008 atomic fp min/max (PR #186716)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Mar 15 16:26:44 PDT 2026


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions ,h,inc,cpp -- libcxx/test/std/atomics/atomics.ref/fetch_fmax.pass.cpp libcxx/test/std/atomics/atomics.ref/fetch_fmaximum.pass.cpp libcxx/test/std/atomics/atomics.ref/fetch_fmaximum_num.pass.cpp libcxx/test/std/atomics/atomics.ref/fetch_fmin.pass.cpp libcxx/test/std/atomics/atomics.ref/fetch_fminimum.pass.cpp libcxx/test/std/atomics/atomics.ref/fetch_fminimum_num.pass.cpp libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_fmax.pass.cpp libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_fmaximum.pass.cpp libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_fmaximum_num.pass.cpp libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_fmin.pass.cpp libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_fminimum.pass.cpp libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/fetch_fminimum_num.pass.cpp libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmax_helper.h libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_helper.h libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_num_helper.h libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmin_helper.h libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_helper.h libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_num_helper.h libcxx/test/std/numerics/c.math/fmaximum.pass.cpp libcxx/test/std/numerics/c.math/fmaximum_num.pass.cpp libcxx/test/std/numerics/c.math/fminimum.pass.cpp libcxx/test/std/numerics/c.math/fminimum_num.pass.cpp libcxx/include/__atomic/atomic.h libcxx/include/__atomic/atomic_ref.h libcxx/include/__math/min_max.h libcxx/include/cmath libcxx/modules/std/cmath.inc --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/libcxx/include/__atomic/atomic_ref.h b/libcxx/include/__atomic/atomic_ref.h
index fe38048cc..93cc102cc 100644
--- a/libcxx/include/__atomic/atomic_ref.h
+++ b/libcxx/include/__atomic/atomic_ref.h
@@ -28,8 +28,8 @@
 #include <__concepts/same_as.h>
 #include <__config>
 #include <__cstddef/byte.h>
-#include <__math/min_max.h>
 #include <__cstddef/ptrdiff_t.h>
+#include <__math/min_max.h>
 #include <__memory/addressof.h>
 #include <__type_traits/has_unique_object_representation.h>
 #include <__type_traits/is_same.h>
diff --git a/libcxx/include/__math/min_max.h b/libcxx/include/__math/min_max.h
index deb4a9b15..9d16baa5a 100644
--- a/libcxx/include/__math/min_max.h
+++ b/libcxx/include/__math/min_max.h
@@ -74,8 +74,10 @@ template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_ar
 template <typename _Tp>
 inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp __fminimum_fallback(_Tp __x, _Tp __y) _NOEXCEPT {
   // Handle NaN: propagate NaN
-  if (__builtin_isnan(__x)) return __x;
-  if (__builtin_isnan(__y)) return __y;
+  if (__builtin_isnan(__x))
+    return __x;
+  if (__builtin_isnan(__y))
+    return __y;
 
   // Handle signed zeros: -0.0 < +0.0
   if (__x == _Tp(0) && __y == _Tp(0)) {
@@ -106,7 +108,8 @@ template <class = int>
 #endif
 }
 
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double fminimum(long double __x, long double __y) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double
+fminimum(long double __x, long double __y) _NOEXCEPT {
 #if 0 // __has_builtin(__builtin_fminimuml) // TODO
   return __builtin_fminimuml(__x, __y);
 #else
@@ -156,7 +159,8 @@ template <class = int>
 #endif
 }
 
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double fminimum_num(long double __x, long double __y) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double
+fminimum_num(long double __x, long double __y) _NOEXCEPT {
 #if 0 // __has_builtin(__builtin_fminimum_numl) // TODO
   return __builtin_fminimum_numl(__x, __y);
 #else
@@ -170,15 +174,17 @@ template <class = int>
 template <typename _Tp>
 inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp __fmaximum_fallback(_Tp __x, _Tp __y) _NOEXCEPT {
   // Handle NaN: propagate NaN
-  if (__builtin_isnan(__x)) return __x;
-  if (__builtin_isnan(__y)) return __y;
+  if (__builtin_isnan(__x))
+    return __x;
+  if (__builtin_isnan(__y))
+    return __y;
 
   // Handle signed zeros: -0.0 < +0.0, so max returns +0.0
   if (__x == _Tp(0) && __y == _Tp(0)) {
     const bool __x_is_neg = __builtin_signbit(__x);
     const bool __y_is_neg = __builtin_signbit(__y);
     if (__x_is_neg != __y_is_neg)
-      return __x_is_neg ? __y : __x;  // Return the positive zero
+      return __x_is_neg ? __y : __x; // Return the positive zero
   }
 
   // Regular comparison
@@ -202,7 +208,8 @@ template <class = int>
 #endif
 }
 
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double fmaximum(long double __x, long double __y) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double
+fmaximum(long double __x, long double __y) _NOEXCEPT {
 #if 0 // __has_builtin(__builtin_fmaximuml) // TODO
   return __builtin_fmaximuml(__x, __y);
 #else
@@ -228,7 +235,7 @@ inline _LIBCPP_HIDE_FROM_ABI constexpr _Tp __fmaximum_num_fallback(_Tp __x, _Tp
     const bool __x_is_neg = __builtin_signbit(__x);
     const bool __y_is_neg = __builtin_signbit(__y);
     if (__x_is_neg != __y_is_neg)
-      return __x_is_neg ? __y : __x;  // Return the positive zero
+      return __x_is_neg ? __y : __x; // Return the positive zero
   }
 
   // Regular comparison
@@ -252,7 +259,8 @@ template <class = int>
 #endif
 }
 
-[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double fmaximum_num(long double __x, long double __y) _NOEXCEPT {
+[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI constexpr long double
+fmaximum_num(long double __x, long double __y) _NOEXCEPT {
 #if 0 // __has_builtin(__builtin_fmaximum_numl) // TODO
   return __builtin_fmaximum_numl(__x, __y);
 #else
diff --git a/libcxx/include/cmath b/libcxx/include/cmath
index a45ed9d18..0cf33b976 100644
--- a/libcxx/include/cmath
+++ b/libcxx/include/cmath
@@ -619,10 +619,10 @@ _LIBCPP_HIDE_FROM_ABI inline constexpr __promote_t<_A1, _A2, _A3> lerp(_A1 __a,
 
 #  if _LIBCPP_STD_VER >= 26
 // C++26 IEEE 754-2019 min/max functions (from C23)
-using __math::fminimum;
 using __math::fmaximum;
-using __math::fminimum_num;
 using __math::fmaximum_num;
+using __math::fminimum;
+using __math::fminimum_num;
 #  endif // _LIBCPP_STD_VER >= 26
 
 _LIBCPP_END_NAMESPACE_STD
diff --git a/libcxx/test/std/atomics/atomics.ref/fetch_fminimum.pass.cpp b/libcxx/test/std/atomics/atomics.ref/fetch_fminimum.pass.cpp
index 235e347ea..b12dc014f 100644
--- a/libcxx/test/std/atomics/atomics.ref/fetch_fminimum.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.ref/fetch_fminimum.pass.cpp
@@ -39,9 +39,9 @@ struct TestFetchFMinimum {
       alignas(std::atomic_ref<T>::required_alignment) T x;
       std::atomic_ref<T> const a(x);
 
-      auto load      = [&]() { return x; };
-      auto store     = [&](T val) { x = val; };
-      auto fminimum  = [&](T val, auto order) { return a.fetch_fminimum(val, order); };
+      auto load     = [&]() { return x; };
+      auto store    = [&](T val) { x = val; };
+      auto fminimum = [&](T val, auto order) { return a.fetch_fminimum(val, order); };
 
       ASSERT_NOEXCEPT(a.fetch_fminimum(T(0), std::memory_order_seq_cst));
       test_fetch_fminimum<T>(load, store, fminimum);
diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_helper.h b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_helper.h
index 58cce9de4..03a2215fe 100644
--- a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_helper.h
+++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_helper.h
@@ -9,15 +9,15 @@
 //===----------------------------------------------------------------------===//
 
 #ifndef TEST_STD_ATOMICS_ATOMIC_FETCH_FMAXIMUM_HELPER_H
-#define TEST_STD_ATOMICS_ATOMIC_FETCH_FMAXIMUM_HELPER_H
+#  define TEST_STD_ATOMICS_ATOMIC_FETCH_FMAXIMUM_HELPER_H
 
-#include <cassert>
-#include <cmath>
-#include <cstring>
-#include <limits>
-#include <type_traits>
+#  include <cassert>
+#  include <cmath>
+#  include <cstring>
+#  include <limits>
+#  include <type_traits>
 
-#include "test_macros.h"
+#  include "test_macros.h"
 
 // Create a NaN with a specific payload to get different bit representations
 template <class T>
diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_num_helper.h b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_num_helper.h
index 8fde3aa8a..ea7d5b84c 100644
--- a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_num_helper.h
+++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fmaximum_num_helper.h
@@ -9,15 +9,15 @@
 //===----------------------------------------------------------------------===//
 
 #ifndef TEST_STD_ATOMICS_ATOMIC_FETCH_FMAXIMUM_NUM_HELPER_H
-#define TEST_STD_ATOMICS_ATOMIC_FETCH_FMAXIMUM_NUM_HELPER_H
+#  define TEST_STD_ATOMICS_ATOMIC_FETCH_FMAXIMUM_NUM_HELPER_H
 
-#include <cassert>
-#include <cmath>
-#include <cstring>
-#include <limits>
-#include <type_traits>
+#  include <cassert>
+#  include <cmath>
+#  include <cstring>
+#  include <limits>
+#  include <type_traits>
 
-#include "test_macros.h"
+#  include "test_macros.h"
 
 // Create a NaN with a specific payload to get different bit representations
 template <class T>
diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_helper.h b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_helper.h
index cfcf8d33e..05d278d54 100644
--- a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_helper.h
+++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_helper.h
@@ -9,15 +9,15 @@
 //===----------------------------------------------------------------------===//
 
 #ifndef TEST_STD_ATOMICS_ATOMIC_FETCH_FMINIMUM_HELPER_H
-#define TEST_STD_ATOMICS_ATOMIC_FETCH_FMINIMUM_HELPER_H
+#  define TEST_STD_ATOMICS_ATOMIC_FETCH_FMINIMUM_HELPER_H
 
-#include <cassert>
-#include <cmath>
-#include <cstring>
-#include <limits>
-#include <type_traits>
+#  include <cassert>
+#  include <cmath>
+#  include <cstring>
+#  include <limits>
+#  include <type_traits>
 
-#include "test_macros.h"
+#  include "test_macros.h"
 
 // Create a NaN with a specific payload to get different bit representations
 template <class T>
diff --git a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_num_helper.h b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_num_helper.h
index 01393bf98..3e2c9bd46 100644
--- a/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_num_helper.h
+++ b/libcxx/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_fminimum_num_helper.h
@@ -9,15 +9,15 @@
 //===----------------------------------------------------------------------===//
 
 #ifndef TEST_STD_ATOMICS_ATOMIC_FETCH_FMINIMUM_NUM_HELPER_H
-#define TEST_STD_ATOMICS_ATOMIC_FETCH_FMINIMUM_NUM_HELPER_H
+#  define TEST_STD_ATOMICS_ATOMIC_FETCH_FMINIMUM_NUM_HELPER_H
 
-#include <cassert>
-#include <cmath>
-#include <cstring>
-#include <limits>
-#include <type_traits>
+#  include <cassert>
+#  include <cmath>
+#  include <cstring>
+#  include <limits>
+#  include <type_traits>
 
-#include "test_macros.h"
+#  include "test_macros.h"
 
 // Create a NaN with a specific payload to get different bit representations
 template <class T>
diff --git a/libcxx/test/std/numerics/c.math/fminimum_num.pass.cpp b/libcxx/test/std/numerics/c.math/fminimum_num.pass.cpp
index c3737e070..22f9f6a64 100644
--- a/libcxx/test/std/numerics/c.math/fminimum_num.pass.cpp
+++ b/libcxx/test/std/numerics/c.math/fminimum_num.pass.cpp
@@ -55,7 +55,7 @@ constexpr bool test() {
   assert(std::fminimum_num(T(+0.0), T(-0.0)) == T(-0.0));
   assert(std::signbit(std::fminimum_num(T(-0.0), T(+0.0))));
   assert(std::signbit(std::fminimum_num(T(+0.0), T(-0.0))));
- 
+
   // Infinity
   assert(std::fminimum_num(inf, T(1.0)) == T(1.0));
   assert(std::fminimum_num(T(1.0), inf) == T(1.0));

``````````

</details>


https://github.com/llvm/llvm-project/pull/186716


More information about the libcxx-commits mailing list