brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · fb40459 Raw
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