[libcxx-commits] [libcxx] [libc++] Implement P2897R7 aligned_accessor: An mdspan accessor expressing pointer over-alignment (PR #122603)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Fri Jan 31 13:13:44 PST 2025


================
@@ -0,0 +1,106 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+
+// #include <memory>
+
+// template<size_t Alignment, class T>
+//   bool is_sufficiently_aligned(T* ptr);
+//
+//
+
+#include <cassert>
+#include <cstddef>
+#include <memory>
+#include <type_traits>
+
+#include "test_macros.h"
+
+template <typename T>
+constexpr void test_is_sufficiently_aligned() {
+  constexpr std::size_t N = alignof(T);
+
+  alignas(8 * N) std::remove_cv_t<T> buf[5];
+
+  assert(std::is_sufficiently_aligned<N>(&buf[0]));
+  assert(std::is_sufficiently_aligned<2 * N>(&buf[0]));
+  assert(std::is_sufficiently_aligned<4 * N>(&buf[0]));
+  assert(std::is_sufficiently_aligned<8 * N>(&buf[0]));
+
+  assert(std::is_sufficiently_aligned<N>(&buf[1]));
+  assert(!std::is_sufficiently_aligned<2 * N>(&buf[1]));
+  assert(!std::is_sufficiently_aligned<4 * N>(&buf[1]));
+  assert(!std::is_sufficiently_aligned<8 * N>(&buf[1]));
+
+  assert(std::is_sufficiently_aligned<N>(&buf[2]));
+  assert(std::is_sufficiently_aligned<2 * N>(&buf[2]));
+  assert(!std::is_sufficiently_aligned<4 * N>(&buf[2]));
+  assert(!std::is_sufficiently_aligned<8 * N>(&buf[2]));
+
+  assert(std::is_sufficiently_aligned<N>(&buf[3]));
+  assert(!std::is_sufficiently_aligned<2 * N>(&buf[3]));
+  assert(!std::is_sufficiently_aligned<4 * N>(&buf[3]));
+  assert(!std::is_sufficiently_aligned<8 * N>(&buf[3]));
+
+  assert(std::is_sufficiently_aligned<N>(&buf[4]));
+  assert(std::is_sufficiently_aligned<2 * N>(&buf[4]));
+  assert(std::is_sufficiently_aligned<4 * N>(&buf[4]));
+  assert(!std::is_sufficiently_aligned<8 * N>(&buf[4]));
+}
+
+template <typename T>
+constexpr void check(T* p) {
+  ASSERT_SAME_TYPE(bool, decltype(std::is_sufficiently_aligned<alignof(T)>(p)));
+  test_is_sufficiently_aligned<T>();
+  test_is_sufficiently_aligned<const T>();
+}
+
+struct S {};
+struct alignas(4) S4 {};
+struct alignas(8) S8 {};
+struct alignas(16) S16 {};
+struct alignas(32) S32 {};
+struct alignas(64) S64 {};
+struct alignas(128) S128 {};
+
+constexpr bool tests() {
----------------
ldionne wrote:

```suggestion
void tests() {
```

https://github.com/llvm/llvm-project/pull/122603


More information about the libcxx-commits mailing list