//===----------------------------------------------------------------------===// // // 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 // #include // template // [[nodiscard]] constexpr T* assume_aligned(T* ptr); #include #include #include #include "test_macros.h" template constexpr void check(T* p) { ASSERT_SAME_TYPE(T*, decltype(std::assume_aligned<1>(p))); constexpr std::size_t alignment = alignof(T); if constexpr (alignment >= 1) assert(p == std::assume_aligned<1>(p)); if constexpr (alignment >= 2) assert(p == std::assume_aligned<2>(p)); if constexpr (alignment >= 4) assert(p == std::assume_aligned<4>(p)); if constexpr (alignment >= 8) assert(p == std::assume_aligned<8>(p)); if constexpr (alignment >= 16) assert(p == std::assume_aligned<16>(p)); if constexpr (alignment >= 32) assert(p == std::assume_aligned<32>(p)); if constexpr (alignment >= 64) assert(p == std::assume_aligned<64>(p)); if constexpr (alignment >= 128) assert(p == std::assume_aligned<128>(p)); } 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() { char c; int i; long l; double d; long double ld; check( &c); check( &i); check( &l); check( &d); check(&ld); S s; S4 s4; S8 s8; S16 s16; S32 s32; S64 s64; S128 s128; check(&s); check(&s4); check(&s8); check(&s16); check(&s32); check(&s64); check(&s128); return true; } int main(int, char**) { tests(); static_assert(tests()); return 0; }