[libcxx-commits] [libcxx] [libc++] Use internal std::__is_sufficiently_aligned for atomic ref constructors and as helper for the public std::is_sufficiently_aligned (PR #188530)

via libcxx-commits libcxx-commits at lists.llvm.org
Wed Mar 25 11:54:19 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Michael Levine (levinem)

<details>
<summary>Changes</summary>

This PR addressed https://github.com/llvm/llvm-project/issues/179803

It introduces a `std::__is_sufficiently_aligned` helper function that can be used for the `atomic_ref` C++20 constructors while the public C++26 `std::is_sufficiently_aligned` delegates to the new helper function.  

---
Full diff: https://github.com/llvm/llvm-project/pull/188530.diff


2 Files Affected:

- (modified) libcxx/include/__atomic/atomic_ref.h (+4-4) 
- (modified) libcxx/include/__memory/is_sufficiently_aligned.h (+6-1) 


``````````diff
diff --git a/libcxx/include/__atomic/atomic_ref.h b/libcxx/include/__atomic/atomic_ref.h
index 69edbfe6ecadd..a5bc0aba38bd2 100644
--- a/libcxx/include/__atomic/atomic_ref.h
+++ b/libcxx/include/__atomic/atomic_ref.h
@@ -30,9 +30,9 @@
 #include <__cstddef/byte.h>
 #include <__cstddef/ptrdiff_t.h>
 #include <__memory/addressof.h>
+#include <__memory/is_sufficiently_aligned.h>
 #include <__type_traits/has_unique_object_representation.h>
 #include <__type_traits/is_trivially_copyable.h>
-#include <cstdint>
 #include <cstring>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -254,7 +254,7 @@ struct atomic_ref : public __atomic_ref_base<_Tp> {
 
   _LIBCPP_HIDE_FROM_ABI explicit atomic_ref(_Tp& __obj) : __base(__obj) {
     _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(
-        reinterpret_cast<uintptr_t>(std::addressof(__obj)) % __base::required_alignment == 0,
+        std::__is_sufficiently_aligned<__base::required_alignment>(std::addressof(__obj)),
         "atomic_ref ctor: referenced object must be aligned to required_alignment");
   }
 
@@ -274,7 +274,7 @@ struct atomic_ref<_Tp> : public __atomic_ref_base<_Tp> {
 
   _LIBCPP_HIDE_FROM_ABI explicit atomic_ref(_Tp& __obj) : __base(__obj) {
     _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(
-        reinterpret_cast<uintptr_t>(std::addressof(__obj)) % __base::required_alignment == 0,
+        std::__is_sufficiently_aligned<__base::required_alignment>(std::addressof(__obj)),
         "atomic_ref ctor: referenced object must be aligned to required_alignment");
   }
 
@@ -320,7 +320,7 @@ struct atomic_ref<_Tp> : public __atomic_ref_base<_Tp> {
 
   _LIBCPP_HIDE_FROM_ABI explicit atomic_ref(_Tp& __obj) : __base(__obj) {
     _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(
-        reinterpret_cast<uintptr_t>(std::addressof(__obj)) % __base::required_alignment == 0,
+        std::__is_sufficiently_aligned<__base::required_alignment>(std::addressof(__obj)),
         "atomic_ref ctor: referenced object must be aligned to required_alignment");
   }
 
diff --git a/libcxx/include/__memory/is_sufficiently_aligned.h b/libcxx/include/__memory/is_sufficiently_aligned.h
index 93d24aaf78f0b..a0ec198993afd 100644
--- a/libcxx/include/__memory/is_sufficiently_aligned.h
+++ b/libcxx/include/__memory/is_sufficiently_aligned.h
@@ -20,11 +20,16 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
+template <size_t _Alignment, class _Tp>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool __is_sufficiently_aligned(_Tp* __ptr) {
+  return reinterpret_cast<uintptr_t>(__ptr) % _Alignment == 0;
+}
+
 #if _LIBCPP_STD_VER >= 26
 
 template <size_t _Alignment, class _Tp>
 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool is_sufficiently_aligned(_Tp* __ptr) {
-  return reinterpret_cast<uintptr_t>(__ptr) % _Alignment == 0;
+  return std::__is_sufficiently_aligned<_Alignment>(__ptr);
 }
 
 #endif // _LIBCPP_STD_VER >= 26

``````````

</details>


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


More information about the libcxx-commits mailing list