//===----------------------------------------------------------------------===// // // 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, c++20, c++23 // // constexpr typename offset_policy::data_handle_type offset(data_handle_type p, size_t i) const noexcept; // // Effects: Equivalent to: return assume_aligned(p) + i; #include #include #include #include #include #include "test_macros.h" // We are not using MinimalElementType.h because MinimalElementType is not // default constructible and uninitialized storage does not work in constexpr. // Same as MinimalElementType but with a defaulted default constructor struct MyMinimalElementType { int val; constexpr MyMinimalElementType() = default; constexpr MyMinimalElementType(const MyMinimalElementType&) = delete; constexpr explicit MyMinimalElementType(int v) noexcept : val(v) {} constexpr MyMinimalElementType& operator=(const MyMinimalElementType&) = delete; }; template constexpr void test_offset() { constexpr std::size_t Sz = 10; alignas(N) T data[Sz]{}; T* ptr = &data[0]; std::aligned_accessor acc; for (std::size_t i = 0; i < Sz; ++i) { std::same_as::data_handle_type> decltype(auto) x = acc.offset(ptr, i); ASSERT_NOEXCEPT(acc.offset(ptr, i)); assert(x == ptr + i); } } template constexpr void test_it() { constexpr std::size_t N = alignof(T); test_offset(); test_offset(); test_offset(); test_offset(); test_offset(); } constexpr bool test() { test_it(); test_it(); test_it(); test_it(); return true; } int main(int, char**) { test(); static_assert(test()); return 0; }