Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / libcxx / test / std / utilities / memory / ptr.align / assume_aligned.pass.cpp
blob72e23a6ad0ec9a4f63b31812fe964770a4ee7bae
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 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
11 // #include <memory>
13 // template<size_t N, class T>
14 // [[nodiscard]] constexpr T* assume_aligned(T* ptr);
16 #include <memory>
17 #include <cassert>
18 #include <cstddef>
20 #include "test_macros.h"
22 template <typename T>
23 constexpr void check(T* p) {
24 ASSERT_SAME_TYPE(T*, decltype(std::assume_aligned<1>(p)));
25 constexpr std::size_t alignment = alignof(T);
27 if constexpr (alignment >= 1)
28 assert(p == std::assume_aligned<1>(p));
29 if constexpr (alignment >= 2)
30 assert(p == std::assume_aligned<2>(p));
31 if constexpr (alignment >= 4)
32 assert(p == std::assume_aligned<4>(p));
33 if constexpr (alignment >= 8)
34 assert(p == std::assume_aligned<8>(p));
35 if constexpr (alignment >= 16)
36 assert(p == std::assume_aligned<16>(p));
37 if constexpr (alignment >= 32)
38 assert(p == std::assume_aligned<32>(p));
39 if constexpr (alignment >= 64)
40 assert(p == std::assume_aligned<64>(p));
41 if constexpr (alignment >= 128)
42 assert(p == std::assume_aligned<128>(p));
45 struct S { };
46 struct alignas( 4) S4 { };
47 struct alignas( 8) S8 { };
48 struct alignas( 16) S16 { };
49 struct alignas( 32) S32 { };
50 struct alignas( 64) S64 { };
51 struct alignas(128) S128 { };
53 constexpr bool tests() {
54 char c;
55 int i;
56 long l;
57 double d;
58 long double ld;
59 check( &c);
60 check( &i);
61 check( &l);
62 check( &d);
63 check(&ld);
65 S s;
66 S4 s4;
67 S8 s8;
68 S16 s16;
69 S32 s32;
70 S64 s64;
71 S128 s128;
72 check(&s);
73 check(&s4);
74 check(&s8);
75 check(&s16);
76 check(&s32);
77 check(&s64);
78 check(&s128);
80 return true;
83 int main(int, char**) {
84 tests();
85 static_assert(tests());
87 return 0;