Index: libcxx/include/memory =================================================================== --- libcxx/include/memory +++ libcxx/include/memory @@ -953,6 +953,19 @@ } }; +#if _LIBCPP_STD_VER >= 20 +template +[[nodiscard]] +_LIBCPP_CONSTEXPR +_LIBCPP_ALWAYS_INLINE +T* assume_aligned(T* __ptr) { + #if defined(__clang__) || (defined(__GNUC__) && !defined(__ICC)) + return reinterpret_cast(__builtin_assume_aligned(__ptr, N)); + #else + return __ptr; + #endif +} +#endif // _LIBCPP_STD_VER >= 20 _LIBCPP_END_NAMESPACE_STD Index: libcxx/test/libcxx/memory/assume_aligned.pass.cpp =================================================================== --- /dev/null +++ libcxx/test/libcxx/memory/assume_aligned.pass.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// + +// +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +// template +// [[nodiscard]] T* assume_aligned(T*); + +#include + +constexpr int test() { + int a; + int* b = std::assume_aligned<4>(&a); + return sizeof(int); +} + +int main(int, char**) +{ + constexpr int N = test(); + int* a = (int*)malloc(N); + int* b = std::assume_aligned<4>(a); + + return 0; +}