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