1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
10
11// #include <memory>
12
13// template<size_t Alignment, class T>
14// bool is_sufficiently_aligned(T* ptr);
15
16#include <cassert>
17#include <cstddef>
18#include <memory>
19#include <type_traits>
20
21#include "test_macros.h"
22
23template <typename T>
24void test_is_sufficiently_aligned() {
25 constexpr std::size_t N = alignof(T);
26
27 alignas(8 * N) std::remove_cv_t<T> buf[5];
28 constexpr std::size_t Sz = sizeof(T);
29
30 assert(std::is_sufficiently_aligned<N>(&buf[0]));
31 assert(std::is_sufficiently_aligned<2 * N>(&buf[0]));
32 assert(std::is_sufficiently_aligned<4 * N>(&buf[0]));
33 assert(std::is_sufficiently_aligned<8 * N>(&buf[0]));
34
35 assert(std::is_sufficiently_aligned<N>(&buf[1]));
36 assert(std::is_sufficiently_aligned<2 * N>(&buf[1]) == (((1 * Sz) % (2 * N)) == 0));
37 assert(std::is_sufficiently_aligned<4 * N>(&buf[1]) == (((1 * Sz) % (4 * N)) == 0));
38 assert(std::is_sufficiently_aligned<8 * N>(&buf[1]) == (((1 * Sz) % (8 * N)) == 0));
39
40 assert(std::is_sufficiently_aligned<N>(&buf[2]));
41 assert(std::is_sufficiently_aligned<2 * N>(&buf[2]) == (((2 * Sz) % (2 * N)) == 0));
42 assert(std::is_sufficiently_aligned<4 * N>(&buf[2]) == (((2 * Sz) % (4 * N)) == 0));
43 assert(std::is_sufficiently_aligned<8 * N>(&buf[2]) == (((2 * Sz) % (8 * N)) == 0));
44
45 assert(std::is_sufficiently_aligned<N>(&buf[3]));
46 assert(std::is_sufficiently_aligned<2 * N>(&buf[3]) == (((3 * Sz) % (2 * N)) == 0));
47 assert(std::is_sufficiently_aligned<4 * N>(&buf[3]) == (((3 * Sz) % (4 * N)) == 0));
48 assert(std::is_sufficiently_aligned<8 * N>(&buf[3]) == (((3 * Sz) % (8 * N)) == 0));
49
50 assert(std::is_sufficiently_aligned<N>(&buf[4]));
51 assert(std::is_sufficiently_aligned<2 * N>(&buf[4]) == (((4 * Sz) % (2 * N)) == 0));
52 assert(std::is_sufficiently_aligned<4 * N>(&buf[4]) == (((4 * Sz) % (4 * N)) == 0));
53 assert(std::is_sufficiently_aligned<8 * N>(&buf[4]) == (((4 * Sz) % (8 * N)) == 0));
54}
55
56template <typename T>
57void check(T* p) {
58 ASSERT_SAME_TYPE(bool, decltype(std::is_sufficiently_aligned<alignof(T)>(p)));
59 test_is_sufficiently_aligned<T>();
60 test_is_sufficiently_aligned<const T>();
61}
62
63struct S {};
64struct alignas(4) S4 {};
65struct alignas(8) S8 {};
66struct alignas(16) S16 {};
67struct alignas(32) S32 {};
68struct alignas(64) S64 {};
69struct alignas(128) S128 {};
70
71struct alignas(1) X {
72 unsigned char d[2];
73};
74static_assert(sizeof(X) == 2 * alignof(X));
75
76bool tests() {
77 char c;
78 int i;
79 long l;
80 double d;
81 long double ld;
82 check(p: &c);
83 check(p: &i);
84 check(p: &l);
85 check(p: &d);
86 check(p: &ld);
87
88 S s;
89 S4 s4;
90 S8 s8;
91 S16 s16;
92 S32 s32;
93 S64 s64;
94 S128 s128;
95 check(p: &s);
96 check(p: &s4);
97 check(p: &s8);
98 check(p: &s16);
99 check(p: &s32);
100 check(p: &s64);
101 check(p: &s128);
102
103 X x;
104 check(p: &x);
105
106 return true;
107}
108
109int main(int, char**) {
110 tests();
111
112 return 0;
113}
114

source code of libcxx/test/std/utilities/memory/ptr.align/is_sufficiently_aligned.pass.cpp