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 Dionneconstexpr 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 Dionneconstexpr 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 Dionneint 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