xref: /llvm-project/libcxx/test/std/utilities/memory/ptr.align/assume_aligned.pass.cpp (revision c292b6066ccaef927ba9e129604f7cfb4f14a79c)
1*c292b606SLouis Dionne //===----------------------------------------------------------------------===//
2*c292b606SLouis Dionne //
3*c292b606SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c292b606SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*c292b606SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*c292b606SLouis Dionne //
7*c292b606SLouis Dionne //===----------------------------------------------------------------------===//
8*c292b606SLouis Dionne 
9*c292b606SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10*c292b606SLouis Dionne 
11*c292b606SLouis Dionne // #include <memory>
12*c292b606SLouis Dionne 
13*c292b606SLouis Dionne // template<size_t N, class T>
14*c292b606SLouis Dionne // [[nodiscard]] constexpr T* assume_aligned(T* ptr);
15*c292b606SLouis Dionne 
16*c292b606SLouis Dionne #include <memory>
17*c292b606SLouis Dionne #include <cassert>
18*c292b606SLouis Dionne #include <cstddef>
19*c292b606SLouis Dionne 
20*c292b606SLouis Dionne #include "test_macros.h"
21*c292b606SLouis Dionne 
22*c292b606SLouis Dionne template <typename T>
check(T * p)23*c292b606SLouis Dionne constexpr void check(T* p) {
24*c292b606SLouis Dionne   ASSERT_SAME_TYPE(T*, decltype(std::assume_aligned<1>(p)));
25*c292b606SLouis Dionne   constexpr std::size_t alignment = alignof(T);
26*c292b606SLouis Dionne 
27*c292b606SLouis Dionne   if constexpr (alignment >= 1)
28*c292b606SLouis Dionne     assert(p == std::assume_aligned<1>(p));
29*c292b606SLouis Dionne   if constexpr (alignment >= 2)
30*c292b606SLouis Dionne     assert(p == std::assume_aligned<2>(p));
31*c292b606SLouis Dionne   if constexpr (alignment >= 4)
32*c292b606SLouis Dionne     assert(p == std::assume_aligned<4>(p));
33*c292b606SLouis Dionne   if constexpr (alignment >= 8)
34*c292b606SLouis Dionne     assert(p == std::assume_aligned<8>(p));
35*c292b606SLouis Dionne   if constexpr (alignment >= 16)
36*c292b606SLouis Dionne     assert(p == std::assume_aligned<16>(p));
37*c292b606SLouis Dionne   if constexpr (alignment >= 32)
38*c292b606SLouis Dionne     assert(p == std::assume_aligned<32>(p));
39*c292b606SLouis Dionne   if constexpr (alignment >= 64)
40*c292b606SLouis Dionne     assert(p == std::assume_aligned<64>(p));
41*c292b606SLouis Dionne   if constexpr (alignment >= 128)
42*c292b606SLouis Dionne     assert(p == std::assume_aligned<128>(p));
43*c292b606SLouis Dionne }
44*c292b606SLouis Dionne 
45*c292b606SLouis Dionne struct              S    { };
46*c292b606SLouis Dionne struct alignas(  4) S4   { };
47*c292b606SLouis Dionne struct alignas(  8) S8   { };
48*c292b606SLouis Dionne struct alignas( 16) S16  { };
49*c292b606SLouis Dionne struct alignas( 32) S32  { };
50*c292b606SLouis Dionne struct alignas( 64) S64  { };
51*c292b606SLouis Dionne struct alignas(128) S128 { };
52*c292b606SLouis Dionne 
tests()53*c292b606SLouis Dionne constexpr bool tests() {
54*c292b606SLouis Dionne   char        c;
55*c292b606SLouis Dionne   int         i;
56*c292b606SLouis Dionne   long        l;
57*c292b606SLouis Dionne   double      d;
58*c292b606SLouis Dionne   long double ld;
59*c292b606SLouis Dionne   check( &c);
60*c292b606SLouis Dionne   check( &i);
61*c292b606SLouis Dionne   check( &l);
62*c292b606SLouis Dionne   check( &d);
63*c292b606SLouis Dionne   check(&ld);
64*c292b606SLouis Dionne 
65*c292b606SLouis Dionne   S    s;
66*c292b606SLouis Dionne   S4   s4;
67*c292b606SLouis Dionne   S8   s8;
68*c292b606SLouis Dionne   S16  s16;
69*c292b606SLouis Dionne   S32  s32;
70*c292b606SLouis Dionne   S64  s64;
71*c292b606SLouis Dionne   S128 s128;
72*c292b606SLouis Dionne   check(&s);
73*c292b606SLouis Dionne   check(&s4);
74*c292b606SLouis Dionne   check(&s8);
75*c292b606SLouis Dionne   check(&s16);
76*c292b606SLouis Dionne   check(&s32);
77*c292b606SLouis Dionne   check(&s64);
78*c292b606SLouis Dionne   check(&s128);
79*c292b606SLouis Dionne 
80*c292b606SLouis Dionne   return true;
81*c292b606SLouis Dionne }
82*c292b606SLouis Dionne 
main(int,char **)83*c292b606SLouis Dionne int main(int, char**) {
84*c292b606SLouis Dionne   tests();
85*c292b606SLouis Dionne   static_assert(tests());
86*c292b606SLouis Dionne 
87*c292b606SLouis Dionne   return 0;
88*c292b606SLouis Dionne }
89