diff --git a/libcxx/include/__memory/is_sufficiently_aligned.h b/libcxx/include/__memory/is_sufficiently_aligned.h index 4280920cabb4b..1d09355d2f419 100644 --- a/libcxx/include/__memory/is_sufficiently_aligned.h +++ b/libcxx/include/__memory/is_sufficiently_aligned.h @@ -23,8 +23,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 26 template -_LIBCPP_HIDE_FROM_ABI bool is_sufficiently_aligned(_Tp* __ptr) { - return reinterpret_cast(__ptr) % _Alignment == 0; +_LIBCPP_HIDE_FROM_ABI constexpr bool is_sufficiently_aligned(_Tp* __ptr) { +# ifdef _LIBCPP_COMPILER_CLANG_BASED + return __builtin_is_aligned(__ptr, _Alignment); +# else + if consteval { + return __builtin_constant_p(__builtin_assume_aligned(__ptr, _Alignment) != nullptr); + } else { + return reinterpret_cast(__ptr) % _Alignment == 0; + } +# endif } #endif // _LIBCPP_STD_VER >= 26 diff --git a/libcxx/test/std/utilities/memory/ptr.align/is_sufficiently_aligned.pass.cpp b/libcxx/test/std/utilities/memory/ptr.align/is_sufficiently_aligned.pass.cpp index fb40459cfe470..ec05af5143a9c 100644 --- a/libcxx/test/std/utilities/memory/ptr.align/is_sufficiently_aligned.pass.cpp +++ b/libcxx/test/std/utilities/memory/ptr.align/is_sufficiently_aligned.pass.cpp @@ -21,7 +21,7 @@ #include "test_macros.h" template -void test_is_sufficiently_aligned() { +constexpr void test_is_sufficiently_aligned() { constexpr std::size_t N = alignof(T); alignas(8 * N) std::remove_cv_t buf[5]; @@ -54,7 +54,7 @@ void test_is_sufficiently_aligned() { } template -void check(T* p) { +constexpr void check(T* p) { ASSERT_SAME_TYPE(bool, decltype(std::is_sufficiently_aligned(p))); test_is_sufficiently_aligned(); test_is_sufficiently_aligned(); @@ -73,7 +73,7 @@ struct alignas(1) X { }; static_assert(sizeof(X) == 2 * alignof(X)); -bool tests() { +constexpr bool test() { char c; int i; long l; @@ -107,7 +107,8 @@ bool tests() { } int main(int, char**) { - tests(); + test(); + static_assert(test()); return 0; }