114 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++2310 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(&c);83 check(&i);84 check(&l);85 check(&d);86 check(&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(&s);96 check(&s4);97 check(&s8);98 check(&s16);99 check(&s32);100 check(&s64);101 check(&s128);102 103 X x;104 check(&x);105 106 return true;107}108 109int main(int, char**) {110 tests();111 112 return 0;113}114