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 #include #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(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(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(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 +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool __is_sufficiently_aligned(_Tp* __ptr) { + return reinterpret_cast(__ptr) % _Alignment == 0; +} + #if _LIBCPP_STD_VER >= 26 template [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool is_sufficiently_aligned(_Tp* __ptr) { - return reinterpret_cast(__ptr) % _Alignment == 0; + return std::__is_sufficiently_aligned<_Alignment>(__ptr); } #endif // _LIBCPP_STD_VER >= 26