brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 41de212 Raw
91 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// <array>10 11// const T* data() const;12 13#include <array>14#include <cassert>15#include <cstddef> // for std::max_align_t16#include <cstdint>17 18#include "test_macros.h"19 20struct NoDefault {21  TEST_CONSTEXPR NoDefault(int) {}22};23 24#if TEST_STD_VER < 1125struct natural_alignment {26  long t1;27  long long t2;28  double t3;29  long double t4;30};31#endif32 33TEST_CONSTEXPR_CXX17 bool tests() {34  {35    typedef double T;36    typedef std::array<T, 3> C;37    const C c = {1, 2, 3.5};38    ASSERT_NOEXCEPT(c.data());39    const T* p = c.data();40    assert(p[0] == 1);41    assert(p[1] == 2);42    assert(p[2] == 3.5);43  }44  {45    typedef double T;46    typedef std::array<T, 0> C;47    const C c = {};48    ASSERT_NOEXCEPT(c.data());49    const T* p = c.data();50    (void)p;51  }52  {53    typedef NoDefault T;54    typedef std::array<T, 0> C;55    const C c = {};56    ASSERT_NOEXCEPT(c.data());57    const T* p = c.data();58    (void)p;59  }60  {61    std::array<int, 5> const c = {0, 1, 2, 3, 4};62    assert(c.data() == &c[0]);63    assert(*c.data() == c[0]);64  }65 66  return true;67}68 69int main(int, char**) {70  tests();71#if TEST_STD_VER >= 1772  static_assert(tests(), "");73#endif74 75  // Test the alignment of data()76  {77#if TEST_STD_VER < 1178    typedef natural_alignment T;79#else80    typedef std::max_align_t T;81#endif82    typedef std::array<T, 0> C;83    const C c           = {};84    const T* p          = c.data();85    std::uintptr_t pint = reinterpret_cast<std::uintptr_t>(p);86    assert(pint % TEST_ALIGNOF(T) == 0);87  }88 89  return 0;90}91