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__) + __attribute__((assume_aligned(N))) +#endif +{ + return __ptr; +} +#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; + [[maybe_unused]] int* b = std::assume_aligned<4>(&a); + return sizeof(int); +} + +int main(int, char**) +{ + constexpr int N = test(); + int* a = (int*)malloc(N); + [[maybe_unused]] int* b = std::assume_aligned<4>(a); + + return 0; +}